Python3 sorted函数中key参数的作用原理
高洛峰
高洛峰 2017-04-17 17:47:14
0
3
1466

这是一个字符串排序,排序规则:小写<大写<奇数<偶数

s = 'asdf234GDSdsf23'  #排序:小写-大写-奇数-偶数
print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))))

这里key接受的函数返回的是一个元组?是如何进行比较的?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
伊谢尔伦

튜플의 첫 번째 값을 먼저 비교하고, FALSE<TRUE이고, 같으면 튜플의 다음 값을 비교하는 식입니다.

洪涛

간단한 예부터 시작해 보겠습니다.

으아악

결과:

으아악

items은 튜플의 목록입니다. 튜플이 정렬된 경우 Python의 내장 함수 sorted(또는 sort)는 튜플의 마지막 요소, 즉 두 요소의 집합에서 정렬합니다. 튜플은 두 가지 기본 정렬로 상상할 수 있습니다:

원래:

으아악

첫 번째 정렬에서는 두 번째 요소를 키로 사용하므로 정렬 결과는 다음과 같습니다.

으아악

두 번째 정렬에서는 첫 번째 요소를 키로 사용하므로 정렬 결과는 다음과 같습니다.

으아악

결론(1):

튜플 정렬은 마지막 요소부터 앞으로 정렬됩니다
즉, 튜플의 정렬 가중치는 첫 번째 요소부터 시작하여 뒤로 감소합니다


그런 다음 부울 값의 정렬을 살펴보겠습니다.

으아악

결과:

으아악

결론 2:

부울 정렬은 False를 앞쪽에, True를 아래쪽에

배치합니다.

그럼 예시를 살펴보고 결과를 관찰할 수 있는 간단한 함수를 작성해 보겠습니다.

으아악

함수 show는 정렬 중에 각 문자에 대한 튜플 키를 생성하는 데 사용되는 현재 문자열 s을 인쇄합니다.

그런 다음 방금 결론 1을 적용합니다. 튜플을 키로 사용하는 대신 등가 를 사용하여 마지막 요소부터 앞으로 키를 정렬하고 점차적으로 s 및 튜플 변경 사항을 관찰합니다. 핵심:

으아악

예상대로 결론 (1)에 따르면 이 접근 방식은 실제로 튜플을 키로 한 번에 정렬하는 것과 동일하다는 것을 알 수 있습니다.
동시에 결론(2)을 관찰하면 isdigit(), isupper(), islower() 등에 의해 생성된 부울 키에 대한 정렬 결과도 예상대로입니다.

으아악

하지만 이것이 최종 결론은 아니라고 생각합니다. 우연의 결과이기 때문입니다(일어났다고 하기에는 지나친 일일 수도 있고, 덜 직관적인 결과라고 해야 할 것입니다). 를 토대로 결론을 내리겠습니다. 결론 (1) 원본 예 분석:

으아악

이 정렬을 다음과 같이 번역할 수 있습니다.

먼저 x 문자 자체를 정렬한 다음, 소문자인지, 대문자인지, 짝수인지, 숫자인지를 정렬합니다.

은 다음과 같이 번역할 수도 있습니다.

문자가 숫자인지 여부를 가장 높은 정렬 가중치로 사용한 다음 문자가 짝수인지, 대문자인지, 소문자인지, 문자 x 자체를 사용합니다. 무게.

이것은 초기 목표(#Sort: 소문자-대문자-홀수-짝수)와 다른 것으로 보이지만 적어도 목표와 직관적인 대응은 없습니다.

다음으로 변경하는 것이 좋습니다.

으아악

이는 다음과 같이 해석될 수 있습니다.

문자가 소문자인지 여부를 가장 큰 가중치로 사용하고, 문자가 대문자인지, 문자가 홀수인지, 문자 x 자체를 정렬 가중치로 사용합니다

흥미로운 점은 판단 공식이 True인 문자를 정렬이 완료된 후 이전 위치와 비교하기를 원하므로 결론 (2)에 따라 not을 추가하여 일치하는 항목이 되도록 합니다. 문자가 앞에 있을 수 있습니다.

小葫芦

핵심은 donghui의 말대로 FALSE<TRUE입니다.
key는 튜플의 정렬 상황입니다. 정렬할 각 요소는 튜플을 생성합니다(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x). 정렬은 이 튜플을 기반으로 하며, false가 첫 번째 순위이고 true가 마지막 순위입니다. 똑같습니다. 다음을 참조하세요. sorted는 궁극적으로 정렬이 필요한 요소를 반환합니다.

테스트 코드는 다음과 같습니다. (dokelungdonghui에서)

으아아아

입력을 실행하고 확인하여 패턴을 발견하세요.
출력:

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿