sorted( <iterable> , key = <function> , reverse = <bool>)
<list>.sort(key = <function>, reverse = <bool>)
list.sort()
와 sorted()
는 모두 비교하기 전에 각 리스트 요소에 대해 호출할 함수를 지정하는 key
매개 변수를 지정할 수 있다.
대소 문자를 구분하지 않는 문자열의 비교
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),
]
# 2번째 인덱스 값인 나이를 기준으로 정렬
sorted(student_tuples, key=lambda student: student[2])
# 결과 : [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
값들을 내가 정한 순서대로 정렬하는 방법이다.
# 정렬하고자 하는 자료
y_data_list = [2, 1, 3, 3, 3, 4, 1, 2, 2, 1]
# 정렬 기준을 저장한 딕셔너리
priority_dict = {4: 0, 2: 1, 3: 2, 1: 3}
# 딕셔너리의 값을 기준으로 정렬
# sorted 사용
sorted(my_data_list, key=lambda x: priority_dict[x])
# sort 사용
my_data_list.sort(key=lambda x: priority_dict[x])
# 결과 : > [4, 2, 2, 2, 3, 3, 3, 1, 1, 1]
key함수로 여러가지 조건을 넣어 정렬하는 방법이다. 정렬할 때 비교하는 두 값이 조건1에 대해 우선순위가 동일하다면, 조건2를 적용하여 정렬하게 된다. 조건이 복수일 때는 튜플로 묶어서 key로 넣어준다.
array = (('b', 1, '나'), ('c', 2, '라'), ('a', 3, '다'), ('a', 7, '가'), ('c', 3, '가'))
print(sorted(array, key=lambda x: (x[0], x[1]))) # 0번, 1번 키(알파벳, 숫자)
print(sorted(array, key=lambda x: (x[0], x[2]))) # 0번, 2번 키(알파벳, 한글)
# 출력
# [('a', 3, '다'), ('a', 7, '가'), ('b', 1, '나'), ('c', 2, '라'), ('c', 3, '가')]
# [('a', 7, '가'), ('a', 3, '다'), ('b', 1, '나'), ('c', 3, '가'), ('c', 2, '라')]