[PYTHON] 다른 목록에 따라 목록을 정렬하는 방법?
PYTHON다른 목록에 따라 목록을 정렬하는 방법?
목록이 있습니다.
a = [("ax", 1), ("ec",3), ("bk", 5)]
또 다른 목록 :
b = ["ec", "ax", "bk"]
나는 b에 따라 a를 정렬하고 싶다 :
sort_it(a, b)
a = [("ec",3), ("ax", 1), ("bk", 5)]
이 작업을 수행하는 방법?
해결법
-
==============================
1.
a.sort(key=lambda x: b.index(x[0]))
이것은 정렬 된 값처럼 a에서 각 튜플의 첫 번째 요소의 b에있는 인덱스를 사용하여 내부 정렬합니다.
또 다른, 가능하게 더 청결한, 그것을 쓰는 방법은 일 것입니다 :
a.sort(key=lambda (x,y): b.index(x))
많은 수의 항목이있는 경우에는 .index ()가 긴 목록에서 값 비싼 연산이 될 수 있고 실제로 이미 전체 정렬을 수행 할 필요가 없기 때문에 조금 다르게 작업하는 것이 더 효율적일 수 있습니다. 주문을 알아라 :
mapping = dict(a) a[:] = [(x,mapping[x]) for x in b]
이 방법은 2 튜플 목록에서만 작동합니다. 임의 길이의 튜플에서 작동하게하려면 약간 수정해야합니다.
mapping = dict((x[0], x[1:]) for x in a) a[:] = [(x,) + mapping[x] for x in b]
-
==============================
2.또 다른 확실성은 a를 정렬하고, b에 따라 b의 인덱스를 정렬하고, 인덱스에 따라 a를 정렬하는 것입니다
또 다른 확실성은 a를 정렬하고, b에 따라 b의 인덱스를 정렬하고, 인덱스에 따라 a를 정렬하는 것입니다
a.sort(key=lambda x: x[0]) ind = [i[0] for i in sorted(enumerate(b),key=lambda x: x[1])] a = [i[0] for i in sorted(zip(a,ind),key=lambda x: x[1])]
모든 정렬에는 n * log (n)이 필요하기 때문에 더 큰 목록에 대해서는 여전히 확장 가능합니다
-
==============================
3.전통적인 분류는 필요하지 않을 수도 있습니다.
전통적인 분류는 필요하지 않을 수도 있습니다.
[tup for lbl in b for tup in a if tup[0] == lbl] # [('ec', 3), ('ax', 1), ('bk', 5)]
from https://stackoverflow.com/questions/12814667/how-to-sort-a-list-according-to-another-list by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 서브 프로세스가 실행되는 동안 stdout 인터셉트 (0) | 2018.10.12 |
---|---|
[PYTHON] 부동 소수점 오류를 방지하는 방법? (0) | 2018.10.12 |
[PYTHON] 파이썬 2.6에서 쓰레드 안전 프린트를 얻으려면 어떻게해야합니까? (0) | 2018.10.12 |
[PYTHON] Selenium Python API 바인딩을 사용하여 Chrome에서 console.log 출력 얻기 (0) | 2018.10.12 |
[PYTHON] UnicodeDecodeError : 'utf8'코덱은 0 위치의 바이트 0xa5을 디코딩 할 수 없습니다 : 잘못된 시작 바이트 (0) | 2018.10.12 |