这是一个字符串排序,排序规则:小写<大写<奇数<偶数
s = 'asdf234GDSdsf23' #排序:小写-大写-奇数-偶数
print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))))
这里key接受的函数返回的是一个元组?是如何进行比较的?
PHP中文网2017-04-17 17:49:14
간단한 예부터 시작해 보겠습니다.
으아악결과:
으아악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
을 추가하여 일치하는 항목이 되도록 합니다. 문자가 앞에 있을 수 있습니다.
高洛峰2017-04-17 17:49:14
핵심은 donghui
의 말대로 FALSE<TRUE입니다.
key는 튜플의 정렬 상황입니다. 정렬할 각 요소는 튜플을 생성합니다(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
. 정렬은 이 튜플을 기반으로 하며, false가 첫 번째 순위이고 true가 마지막 순위입니다. 똑같습니다. 다음을 참조하세요. sorted는 궁극적으로 정렬이 필요한 요소를 반환합니다.
테스트 코드는 다음과 같습니다. (dokelung
및 donghui
에서)
입력을 실행하고 확인하여 패턴을 발견하세요.
출력: