IT

정렬 된 목록의 색인을 반환하는 방법?

lottoking 2020. 8. 5. 07:36
반응형

정렬 된 목록의 색인을 반환하는 방법? [복제]


이 질문에는 이미 답변이 있습니다.

목록을 정렬 한 다음 목록에서 정렬 된 항목의 색인이있는 목록을 반환해야합니다. 예를 들어 필요한 경우 목록이 인 경우 반환 [2,3,1,4,5]해야 [2,0,1,3,4]합니다.

이 질문은 바이트로 게시 여기에 다시 게시 할 생각했습니다. http://bytes.com/topic/python/answers/44513-sorting-list-then-return-index-sorted-item

객체의 속성을 기준으로 객체 목록을 정렬해야합니다. 그런 다음 새로 정렬 된 목록의 순서와 일치하는 목록을 다시 정렬해야합니다.

수행하는 좋은 방법이 있습니까?


키워드 정렬 함수의 key규칙 변수를 사용하여 대신 배열을 정렬 할 수 있습니다 .

>>> s = [2, 3, 1, 4, 5]
>>> sorted(range(len(s)), key=lambda k: s[k])
[2, 0, 1, 3, 4]
>>> 

numpy를 사용할 수있는 경우 numpy의 argsort 메소드로이를 수행 할 수 있습니다.

>>> import numpy
>>> vals = numpy.array([2,3,1,4,5])
>>> vals
array([2, 3, 1, 4, 5])
>>> sort_index = numpy.argsort(vals)
>>> sort_index
array([2, 0, 1, 3, 4])

사용할 수없는 경우이 질문 에서 그것이 가장 빠른 방법입니다.

>>> vals = [2,3,1,4,5]
>>> sorted(range(len(vals)), key=vals.__getitem__)
[2, 0, 1, 3, 4]

모든 필요한 경우 다음을 수행 할 수 있습니다.

>>> L = [2,3,1,4,5]
>>> from operator import itemgetter
>>> indices, L_sorted = zip(*sorted(enumerate(L), key=itemgetter(1)))
>>> list(L_sorted)
[1, 2, 3, 4, 5]
>>> list(indices)
[2, 0, 1, 3, 4]

또는 Python <2.4 (아니오 itemgetter또는 sorted)의 경우 :

>>> temp = [(v,i) for i,v in enumerate(L)]
>>> temp.sort
>>> indices, L_sorted = zip(*temp)

ps zip(*iterable)관용구는 zip 프로세스를 취소합니다 (압축 해제).


최신 정보 :

특정 요구 사항을 처리 비용

"특정 개체의 속성에 따라 개체 목록을 정렬해야합니다. 그런 다음 새로 정렬 된 목록의 순서와 일치하는 해당 목록을 다시 정렬해야합니다."

그렇게하는 데 오랜 시간이 걸렸습니다. 두 목록을 모두 압축 한 다음 객체 속성을 정렬 키로 사용하여 정렬하면 (그리고 압축 해제) 단일 정렬로이를 달성 할 수 있습니다.

zipped = zip(obj_list, secondary_list)
zipped_sorted = sorted(combined, key=lambda x: x[0].some_obj_attribute)
obj_list, secondary_list = map(list, zip(*zipped_sorted))

다음은 단순 예입니다. 여기서는 길이를 정렬 키로 사용합니다.

>>> str_list = ["banana", "apple", "nom", "Eeeeeeeeeeek"]
>>> sec_list = [0.123423, 9.231, 23, 10.11001]
>>> temp = sorted(zip(str_list, sec_list), key=lambda x: len(x[0]))
>>> str_list, sec_list = map(list, zip(*temp))
>>> str_list
['nom', 'apple', 'banana', 'Eeeeeeeeeeek']
>>> sec_list
[23, 9.231, 0.123423, 10.11001]

어때요?

l1 = [2,3,1,4,5]
l2 = [l1.index(x) for x in sorted(l1)]

당신이 사용할 수있는 numpy.argsort

또는 당신은 할 수 있습니다 :

test =  [2,3,1,4,5]
idxs = list(zip(*sorted([(val, i) for i, val in enumerate(test)])))[1]

zip첫 번째 요소는 test이고 두 번째 요소는 idxs입니다.


내가 원하는 것, 특정 요구 사항을 보는 것 :

a이있는 목록 이 존재하는 키가 x목록에 생성 의 속성 존재 합니다.b

keys = {i:j.x for i,j in zip(a, b)}
a.sort(key=keys.__get_item__)

이 방법을 사용하면 요청한 중간 순열 목록을 구성하지 목록을 정렬 할 수 있습니다.


다음에 대한 문서에서 곧바로 collections.OrderedDict:

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

원본 게시물의 예에 적용 :

>>> l=[2,3,1,4,5]
>>> OrderedDict(sorted(enumerate(l), key=lambda x: x[1])).keys()
[2, 0, 1, 3, 4]

자세한 내용은 http://docs.python.org/library/collections.html#collections.OrderedDict 를 참조하세요.

참고 URL : https://stackoverflow.com/questions/7851077/how-to-return-index-of-a-sorted-list

반응형