본문 바로가기

Python

[Python] [정렬] list.sort()와 sorted()의 차이

sorted()

오름차순으로 정렬새로운 리스트를 반환한다.

원래 목록은 영향 받지 않는다.

리스트뿐만 아니라 반복 가능한 모든 작업에 적용할 수 있다.

(ex. 문자열, 튜플, 딕셔너리, 제너레이터 등)

s = [3, 1, 5, 4, 2]
print(sorted(s)) # [1, 2, 3, 4, 5]
print(s) # [3, 1, 5, 4, 2]

list.sort()

해당 리스트를 오름차순으로 정렬한다.

리스트의 인덱스를 변경하고 None을 반환한다.

리스트에게만 정의되는 메소드이다.

리스트의 경우에는 list.sort()가 복사본을 만들 필요가 없으므로 sorted()보다 빠르다.

s = [3, 1, 5, 4, 2]
print(s.sort()) # None
print(s) # [1, 2, 3, 4, 5]

# 내림차순으로 정렬
s.sort(reverse=True)
print(s) # [5, 4, 3, 2, 1]

Key Functions

list.sort()와 sorted() 둘다 비교하기 전에 각 list 요소에 호출할 함수(또는 다른 호출 가능한 것)를 지정하는 key parameter를 갖고 있다. 

 

ex) 대/소문자를 구분하지 않는 문자열 비교

sorted("This is a test string from Andrew".split(), key=str.lower)
# ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

 

키 매개 변수의 값은 단일 인자를 사용하고 정렬 목적으로 사용할 키를 반환하는 함수(또는 다른 호출 가능)여야 한다. 이 기법은 키 함수가 각 입력 레코드에 대해 정확히 한 번 호출되기 때문에 빠르다.

 

일반적인 패턴은 객체의 일부 인덱스를 키로 사용하여 복잡한 객체를 정렬하는 것이다.

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
sorted(student_tuples, key=lambda student: student[2])   # sort by age
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 

참고: velog.io/@sparkbosing/Python-sort%EC%99%80-sorted-%EC%B0%A8%EC%9D%B4,
파이썬 공식 문서, https://docs.python.org/3/howto/sorting.html