파이썬 sort() & sorted()

민갱·2023년 1월 26일
0

Python

목록 보기
2/11

파이썬을 코딩테스트 용으로 시작하고 나서 자주 사용하는데 초반에 참 많이 헷갈린 함수가 있는데, sort & sorted
도대체 왜 정렬함수를 두개나 만들었을까??
속도면에서는 sort()가 더 빠르다지만,,ㅎㅎ 너무 친절하네 파이썬 :)

python sort와 sorted의 차이

두 함수 차이점 한번 정리해보자.

sort() 메서드

  • sort 함수에는 정렬을 위해 고려할 값을 정의하는 데 사용할 수 있는 key라는 또 다른 매개변수가 있다.
  • 예를 들어 쌍 목록이 있고 두 번째 값을 고려하여 쌍을 정렬하려는 경우 key 매개변수를 사용하여 이를 수행할 수 있다.
  • sort()의 경우 결과값을 반환해서 보여주지 않으므로 결과를 확인하기 위해서는 출력을 해주어야 한다.
    Ex.
arr.sort()
arr
==>[1, 2, 3, 4, 5]
- 목록을 역순으로 정렬하려면 reverse 인수를 True로 설정하여 목록을 정렬할 수도 있습니다.

arr.sort(reverse = True)
=> [5,4,3,2,1]

key 매개변수의 Ex.

def byName(entry):
    return entry["name"]
    
def byAge(entry):
    return entry["age"]
    
def byRank(entry):
    return entry["rank"]
    
data = [{
        "name": "Vaibhav",
        "age": 18,
        "rank": 1,
    }, {
        "name": "Steve",
        "age": 24,
        "rank": 5,
    }, {
        "name": "Olive",
        "age": 12,
        "rank": 2,
    },{
        "name": "Allison",
        "age": 17,
        "rank": 4,
    }]

print("Original Data")    
print(data)

print("Sorted by Name")
data.sort(key = byName)
print(data)

print("Sorted by Age")
data.sort(key = byAge)
print(data)

print("Sorted by Rank")
data.sort(key = byRank)
print(data)

출력.

[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]

sorted() 메서드

  • 새로운 정렬된 목록을 반환하며, 원래 목록은 영향을 받지 않는다.
  • sort 기능과 마찬가지로 sorted도 목록을 정렬하는 데 사용된다. 그러나 sorted 함수는 동일한 목록을 제자리에 정렬하는 대신 새 목록을 반환한다.
    이것이 두 기능의 주요 차이점이다.

Ex.

myList = [1, 5, 2 ,10, 33, 3, 9]
print("Before called sorted():", myList)

newList = sorted(myList)
print("After called sorted():", myList)

print("New list:", newList)

출력.

Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [1, 2, 3, 5, 9, 10, 33]

sorted 함수에 전달한 목록은 그대로 유지되고 newList 변수 안에 저장된 새 목록이 반환되었다. 두 매개변수, 즉 reverse 및 key도 이 기능에서 사용할 수 있다. 두 가지를 사용하여 역순으로 정렬된 목록을 얻고 사용자 지정 키를 기반으로 목록을 정렬할 수 있다.

reverse 매개변수의 Ex.

myList = [1, 5, 2 ,10, 33, 3, 9]
print("Before called sorted():", myList)

newList = sorted(myList, reverse = True)
print("After called sorted():", myList)

print("New list:", newList)

출력.

Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [33, 10, 9, 5, 3, 2, 1]

key 매개변수의 Ex.

def byName(entry):
    return entry["name"]
    
def byAge(entry):
    return entry["age"]
    
def byRank(entry):
    return entry["rank"]
    
data = [{
        "name": "Vaibhav",
        "age": 18,
        "rank": 1,
    }, {
        "name": "Steve",
        "age": 24,
        "rank": 5,
    }, {
        "name": "Olive",
        "age": 12,
        "rank": 2,
    },{
        "name": "Allison",
        "age": 17,
        "rank": 4,
    }]

print("Original Data")    
print(data)
print("Sorted by Name")

nameSorted = sorted(data, key = byName)
print(nameSorted)
print("Sorted by Age")

ageSorted = sorted(data, key = byAge)
print(ageSorted)
print("Sorted by Rank")

rankSorted = sorted(data, key = byRank)
print(rankSorted)

print("Data after all operations")    
print(data)

출력.

Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Data after all operations
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]

tuple

tuple_list = [ (3, 4), (1, 2), (2, 5) ]
tuple_list.sort()
tuple_list
>>> [(1, 2), (2, 5), (3, 4)]

key가 없이 sort 함수 사용 시 첫번째 원소를 기준으로 정렬한다.

그 중 튜플의 첫 번째 원소를 특정해서 정렬하고 싶다면 아래와 같이 작성하며 된다

# 오름차순
tuple_list.sort(key=lambda x: x[0])

#내림차순
tuple_list.sort(key=lambda x: x[0], reverse=True)
or
tuple_list.sort(key=lambda x: -x[0])

튜플의 첫 번째 원소로 정렬, 이후 같은 값이 나오면 두 번째 원소 정렬하는 방식

tuple_list.sort(key=lambda x: (x[0], x[1]))

튜플의 두 번째 원소로 정렬, 이후 같은 값이 나오면 첫 번째 원소 정렬하는 방식

tuple_list.sort(key=lambda x: (x[1], x[0]))
profile
가보자고

0개의 댓글