아래 목록을 정렬하려고합니다.
points = [[1, 4, 'start'], [1, 6, 'start'], [2, 8, 'end'], [2, 5, 'end'], [3, 4, 'end'], [3, 9, 'start']]
예상 출력 :
[[1, 6, 'start'], [1, 4, 'start'], [2, 5, 'end'], [2, 8, 'end'], [3, 9, 'start'], [3, 4, 'end']]
정렬 조건은 다음과 같습니다.
p1 [0] == p2 [0] 및 p1 [2] == 'start'및 p2 [2] == 'start'이면 더 큰 값을 가진 p1 [1] 또는 p2 [1]이 먼저 와야합니다.
p1 [0] == p2 [0] 및 p1 [2] == 'end'및 p2 [2] == 'end'이면 더 작은 값을 가진 p1 [1] 또는 p2 [1]이 먼저 와야합니다.
p1 [0] == p2 [0] 및 p1 [2] == 'start'및 p2 [2] == 'end'이면 'start'가있는 점이 먼저 와야합니다.
사용자 지정 비교기를 작성하려고했습니다 (정답을 얻음). 이것이 올바른 접근 방식인지 궁금합니다. 더 간단 할 수 있습니까?
def mycmp(p1, p2):
if p1[0] < p2[0]:
return -1
if p1[0] == p2[0]:
if p1[2] == 'start' and p2[2] == 'start' and p1[1] > p2[1]:
return -1
elif p1[2] == 'end' and p2[2] == 'end' and p1[1] < p2[1]:
return -1
elif p1[2] == 'start' and p2[2] == 'end':
return -1
return 0
points.sort(key=cmp_to_key(mycmp))
points.sort(key = lambda x: (x[0], x[2] == 'end', -x[1] if x[2] == 'start' else x[1]))
를 사용할 수 있습니까? lambda
핵심은 @Jack 덕분에 우선 순위를 지정하는 것입니다.
람다 함수 내에서 총 3 개의 키를 사용했습니다.
먼저에서 정렬합니다 x[0] in ascending order
.
거기에 넥타이가 있으면 high priority to x[2] = end
그리고 마지막으로 정렬 x[1] in descending order if x[2]=start and ascending if x[2]=end
Logic is to specify your priorities in order inside the lambda function
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다