반응형
커스텀 Python 목록 정렬
나는 내 오래된 코드를 리팩토링하고 있었고 이것을 발견했습니다.
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()사용자 지정 정렬을 구현하는 데 사용 합니다. 누군가 이것이 왜 작동하는지 설명 할 수 있습니까?
sort () 메서드는 비교를 제어하기위한 선택적 인수를 사용합니다.
cmp는 첫 번째 인수가 두 번째 인수보다 작은 지, 같은지 또는 큰지 여부에 따라 음수, 0 또는 양수를 반환해야하는 두 인수 (목록 항목)의 사용자 지정 비교 함수를 지정합니다. cmp = lambda x, y : cmp (x.lower (), y.lower ()). 기본값은 없음입니다.
참고로 다음은 동일한 정렬을 구현하는 더 나은 대안입니다.
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
드디어:
다만 sort(letter_cmp)
이것은 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)
참고 URL : https://stackoverflow.com/questions/11850425/custom-python-list-sorting
반응형
'program story' 카테고리의 다른 글
| Task.Factory.StartNew ()는 호출 스레드가 아닌 다른 스레드를 사용하도록 보장됩니까? (0) | 2020.10.22 |
|---|---|
| Windows에서 동시에 실행되는 여러 Java 버전 (0) | 2020.10.22 |
| 60 초 내에 안정적인 Firefox 연결을 얻을 수 없음 (127.0.0.1:7055) (0) | 2020.10.21 |
| -단일 분기 클론을 "실행 취소"하려면 어떻게합니까? (0) | 2020.10.21 |
| Sublime Text의 모든 줄에 커서를 놓을 수 있습니까? (0) | 2020.10.21 |