정렬 된 목록의 색인을 반환하는 방법? [복제]
이 질문에는 이미 답변이 있습니다.
목록을 정렬 한 다음 목록에서 정렬 된 항목의 색인이있는 목록을 반환해야합니다. 예를 들어 필요한 경우 목록이 인 경우 반환 [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
'IT' 카테고리의 다른 글
malloc을 사용할 때마다 경고 메시지가 있고 이유는 무엇입니까? (0) | 2020.08.05 |
---|---|
프로그래밍 방식으로 활동을 다시 시작 / 재 작성 하시겠습니까? (0) | 2020.08.05 |
각도로 입력 요소의 ngModel 내에서 파이프 사용 (0) | 2020.08.05 |
Objective-C 클래스에서 Swift 프로토콜 가져 오기 (0) | 2020.08.04 |
SimpleXML에서 @attribute에 액세스 (0) | 2020.08.04 |