복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.전통적인 분류는 필요하지 않을 수도 있습니다.

    전통적인 분류는 필요하지 않을 수도 있습니다.

    [tup for lbl in b for tup in a if tup[0] == lbl]
    # [('ec', 3), ('ax', 1), ('bk', 5)]
    
  4. from https://stackoverflow.com/questions/12814667/how-to-sort-a-list-according-to-another-list by cc-by-sa and MIT license