두 목록의 목록이 있는데, 두 번째 목록에 대해 첫 번째 목록을 정렬하고 싶습니다. 예를 들어 여기에 두 가지가 있습니다.
old = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9],
[7, 3, 2, 5, 4, 6, 1, 8, 0, 9],
[9, 2, 8, 7, 1, 5, 0, 4, 6, 3]]
new = [[4, 1, 5, 6, 7, 9, 10, 11, 8, 2, 3, 0],
[10, 6, 4, 3, 0, 11, 2, 5, 8, 1, 9, 7],
[0, 1, 7, 10, 9, 6, 4, 5, 8, 2, 3, 11]]
new
목록 목록과 목록 목록 을 정렬하고 싶습니다 old
. 새 항목의 경우 항목이
sorted_new = [[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11],
[7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11],
[9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]]
유의해야 할 중요한 점은 일치 할 두 목록의 크기가 같지 않다는 것입니다. 이것을 어떻게 얻을 수 있습니까?
다음 접근 방식을 사용할 수 있습니다.
sorted_new = []
for sub_new,sub_old in zip(new,old):
old_idx = {k:v for v,k in enumerate(sub_old)}
sorted_new.append(sorted(sub_new,key=lambda x:old_idx.get(x,len(sub_old))))
그러면 다음이 생성됩니다.
>>> sorted_new
[[1, 7, 3, 2, 5, 4, 6, 0, 8, 9, 10, 11], [7, 3, 2, 5, 4, 6, 1, 8, 0, 9, 10, 11], [9, 2, 8, 7, 1, 5, 0, 4, 6, 3, 10, 11]]
코드는 다음과 같이 작동합니다. 먼저 두 목록 new
을 old
동시에 실행합니다. 그러한 모든 쌍의 목록에 대해. 먼저 의 요소를 목록의 해당 색인에 매핑하는 사전 이해를 사용하여 사전을 생성 sub_old
합니다.
다음으로 우리는 sub_new
. 그 요소가있는 경우 sub_new
에 old_idx
, 우리는 인덱스를 돌려줍니다 (이 이렇게 정렬 키)입니다. 그렇지 않은 경우 기본을 반환 len(sub_old)
하므로 사전에있는 모든 인덱스보다 큽니다. 결과적으로 해당 요소는 목록의 오른쪽에 배치됩니다.
Python의 정렬 기능은 안정적 이므로.에없는 요소 old
는 원래 순서를 유지합니다.
우리는 list.index(..)
그러한 인덱스 사전을 구성하는 대신 메서드에 마법을 사용할 수있었습니다 . 그러나 문제 .index(..)
는 O (n) 에서 실행된다는 것 입니다. 따라서이 알고리즘 만들 것이다 O (m × N N 로그) 와, 각 서브리스트에 대한 m 요소의 수 old
와 N 의 요소 수를 new
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다