나는 내 오래된 코드를 리팩토링하고 있었고 이것을 발견했습니다.
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
코드는 작동하지만 (약 3 년 전에 작성했습니다!) Python 문서의 어느 곳에서도이 문서를 찾을 수 없으며 모두가 sorted()
사용자 지정 정렬을 구현하는 데 사용 합니다. 누군가 이것이 왜 작동하는지 설명 할 수 있습니까?
답변
답변
참고로 다음은 동일한 정렬을 구현하는 더 나은 대안입니다.
alist.sort(key=lambda x: x.foo)
또는 :
import operator
alist.sort(key=operator.attrgetter('foo'))
Sorting How To를 확인하십시오 . 매우 유용합니다.
답변
이 예처럼. 이 목록을 정렬하고 싶습니다.
[('c', 2), ('b', 2), ('a', 3)]
산출:
[('a', 3), ('b', 2), ('c', 2)]
두 번째 항목을 기준으로 튜플을 정렬 한 다음 첫 번째 항목을 정렬해야합니다.
def letter_cmp(a, b):
if a[1] > b[1]:
return -1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
else:
return -1
else:
return 1
그런 다음 키 함수로 변환하십시오.
from functools import cmp_to_key
letter_cmp_key = cmp_to_key(letter_cmp))
이제 사용자 지정 정렬 순서를 사용할 수 있습니다.
[('c', 2), ('b', 2), ('a', 3)].sort(key=letter_cmp_key)
답변
이것은 Python 3에서 작동하지 않습니다.
functools cmp_to_key를 사용하여 이전 스타일의 비교 함수가 작동하도록 할 수 있습니다.
from functools import cmp_to_key
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
cmp_items_py3 = cmp_to_key(cmp_items)
alist.sort(cmp_items_py3)
답변
많은 사람들이 이미 좋은 답변을 올렸다는 것을 알고 있습니다. 그러나 라이브러리를 가져 오지 않고 멋지고 쉬운 방법을 제안하고 싶습니다.
l = [(2, 3), (3, 4), (2, 4)]
l.sort(key = lambda x: (-x[0], -x[1]) )
print(l)
l.sort(key = lambda x: (x[0], -x[1]) )
print(l)
출력은
[(3, 4), (2, 4), (2, 3)]
[(2, 4), (2, 3), (3, 4)]
출력은 튜플 형식으로 제공 한 매개 변수의 순서에 따라 정렬됩니다.
답변
더 나은 :
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)]