사용자 지정 파이썬 목록 정렬
예전의 내 코드를 리팩토링하다가 이걸 발견했어요
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년 전에 작성했습니다!). 하지만 파이썬 문서 어디에서도 이 문서를 찾을 수 없고 모두가 사용합니다.sorted()
사용자 정의 정렬을 구현합니다.누가 이것이 왜 작동하는지 설명해 줄 수 있습니까?
참고 사항으로, 동일한 정렬을 구현할 수 있는 더 나은 대안이 있습니다.
alist.sort(key=lambda x: x.foo)
또는 다음과 같습니다.
import operator
alist.sort(key=operator.attrgetter('foo'))
방법 정렬을 확인해 보십시오. 매우 유용합니다.
여기에 기록되어 있습니다.
sort() 메서드는 비교를 제어하기 위해 선택적 인수를 사용합니다.
cmp는 첫 번째 인수가 두 번째 인수보다 작거나 같거나 큰 것으로 간주되는지 여부에 따라 음수, 0 또는 양수를 반환해야 하는 두 인수(목록 항목)의 사용자 지정 비교 함수(cmp=lambda x,y:cmp(x.lower (), y.lower ())를 지정합니다.기본값은 없음입니다.
이 예처럼.이 목록을 정렬하고 싶으십니다.
[('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)
이것은 파이썬 3에서는 작동하지 않습니다.
함수 도구 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(key = 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)]
출처: https://docs.python.org/3/howto/sorting.html
언급URL : https://stackoverflow.com/questions/11850425/custom-python-list-sorting
'programing' 카테고리의 다른 글
ui-grid 행의 높이를 변경하는 방법은? (0) | 2023.11.04 |
---|---|
pip을 사용할 수 없기 때문에 pyvenv가 작동하지 않습니다. (0) | 2023.11.04 |
php_network_getaddresses: 도커의 관리자에서 getaddrinfo 오류가 발생했습니다. (0) | 2023.11.04 |
숫자가 아닌 텍스트를 보여주기 위해 집계 없이 엑셀로 피벗? (0) | 2023.11.04 |
JavaScript clearTimeout이 작동하지 않습니다. (0) | 2023.11.04 |