programing

동일한 방법으로 (서로 참조하는)2개의 리스트를 정렬하는 방법

newsource 2022. 12. 6. 22:00

동일한 방법으로 (서로 참조하는)2개의 리스트를 정렬하는 방법

두 가지 목록이 있다고 가정합니다.

list1 = [3, 2, 4, 1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']

★★★★★★★를 실행했을 경우list1.sort()ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ.[1,1,2,3,4] 어떻게 받을 수 있을까요?list2이라고 말할 수 있도록) .4'three'과 같습니다 그럼 예상되는 출력은 다음과 같습니다.

list1 = [1, 1, 2, 3, 4]
list2 = ['one', 'one2', 'two', 'three', 'four']

문제는 목록과 함께 잘 작동하는 매우 복잡한 프로그램이 있지만 데이터를 참조해야 한다는 것입니다.이것이 사전의 이상적인 상황인 것은 알지만, 키 값을 정렬할 필요가 있기 때문에(사전을 사용할 필요가 있는 경우는 사전을 사용하는 방법을 알고 있습니다) 처리 중에 사전을 사용하지 않도록 하고 있습니다.

기본적으로 이 프로그램의 성격은 데이터가 랜덤 순서(상기와 같이)로 정렬하고 처리한 후 결과를 전송해야 한다는 것입니다(순서는 중요하지 않지만 사용자는 어떤 결과가 어떤 키에 속하는지 알아야 합니다).사전에 먼저 넣고, 다음으로 리스트1을 정렬할까 생각했지만 순서가 유지되지 않으면 (사용자에게 결과를 전달할 때 영향을 줄 수 있음)의 값이 같은 항목을 구별할 방법이 없습니다.이상적으로는 일단 목록을 입수하면 두 목록을 함께 분류하는 방법을 찾아내는 것이 좋습니다.이게 가능합니까?

중 는 " 파이썬에 된 "decorate, sort, undecorate"를 .이것은 특히 파이썬의 빌트인을 사용하여 간단합니다.zip★★★★

>>> list1 = [3,2,4,1, 1]
>>> list2 = ['three', 'two', 'four', 'one', 'one2']
>>> list1, list2 = zip(*sorted(zip(list1, list2)))
>>> list1
(1, 1, 2, 3, 4)
>>> list2 
('one', 'one2', 'two', 'three', 'four')

물론, 이것들은 리스트가 아닙니다만, 문제가 있는 경우는 간단하게 수정할 수 있습니다.

>>> list1, list2 = (list(t) for t in zip(*sorted(zip(list1, list2))))
>>> list1
[1, 1, 2, 3, 4]
>>> list2
['one', 'one2', 'two', 'three', 'four']

번거로움 때문에 속도가 저하될 수 있으므로 주의해 주십시오.인플레이스 버전은 3줄로 구성되어 있기 때문에 소량 리스트의 경우 머신에서 조금 더 빠릅니다.

>>> %timeit zip(*sorted(zip(list1, list2)))
100000 loops, best of 3: 3.3 us per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100000 loops, best of 3: 2.84 us per loop

한편, 리스트가 큰 경우는, 1 행의 버전이 고속인 경우가 있습니다.

>>> %timeit zip(*sorted(zip(list1, list2)))
100 loops, best of 3: 8.09 ms per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100 loops, best of 3: 8.51 ms per loop

Quantum7이 지적했듯이, JSF의 제안은 여전히 조금 더 빠르지만, Python은 내부적으로 모든 키 기반 정렬에 동일한 DSU 관용어를 사용하기 때문에 아마도 조금 더 빠를 것이다.그냥 베어메탈에 조금 더 가까이서 일어나고 있어요.(이것은, 최적으로 최적화되어 있는 것을 나타내고 있습니다).zip★★★★★★★★★★★★★★★★★★」

에는 ★★★★★★★★★★★★★★★★★★★★★.zip 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.


「」의 : 「」의 경우는, 「」에해 주세요.list1이 은 '비교'의 요소를 .list2. 의 の 。list2않거나할 때 하지 않습니다 "비교할 때 부울을 생성하지 않습니다."list2배열 NumPy 의 가 NumPy 의 배열 목록이며, NumPy 의 는 NumPy 의 배열 목록입니다.또한 경우list2비교가 매우 비싸기 때문에, 어쨌든 비교를 피하는 것이 좋을지도 모릅니다.

인덱스를 하거나 jfs의 를 비교하는 하는 키 수 .또한 이 정렬에 중요한 기능을 부여하여 요소의 비교를 회피할 수 있습니다.list2:

result1, result2 = zip(*sorted(zip(list1, list2), key=lambda x: x[0]))

「 」, 「 」의 .zip(*...)입력이 비어 있으면 전치가 실패하기 때문입니다.입력이 비어 있는 경우는, 그 케이스를 개별적으로 취급할 필요가 있습니다.

값을 키로 사용하여 인덱스를 정렬할 수 있습니다.

indexes = range(len(list1))
indexes.sort(key=list1.__getitem__)

정렬된 인덱스가 지정된 정렬된 목록을 가져오려면:

sorted_list1 = map(list1.__getitem__, indexes)
sorted_list2 = map(list2.__getitem__, indexes)

, 당신은 '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니', '아주머니가 있으면 안 돼요.list1,list2으로 되어 있습니다

data = [(3, 'three'), (2, 'two'), (4, 'four'), (1, 'one'), (1, 'one2')]

Python에서는 간단하게 작성할 수 있습니다.

data.sort() # sort using a pair as a key

첫 번째 값만 기준으로 정렬:

data.sort(key=lambda pair: pair[0])

하게 되었다.np.argsort작동 방식은 다음과 같습니다.

# idx works on np.array and not lists.
list1 = np.array([3,2,4,1])
list2 = np.array(["three","two","four","one"])
idx   = np.argsort(list1)

list1 = np.array(list1)[idx]
list2 = np.array(list2)[idx]

저는 이 솔루션이 더 직관적이고 잘 작동한다고 생각합니다.퍼포먼스:

def sorting(l1, l2):
    # l1 and l2 has to be numpy arrays
    idx = np.argsort(l1)
    return l1[idx], l2[idx]

# list1 and list2 are np.arrays here...
%timeit sorting(list1, list2)
100000 loops, best of 3: 3.53 us per loop

# This works best when the lists are NOT np.array
%timeit zip(*sorted(zip(list1, list2)))
100000 loops, best of 3: 2.41 us per loop

# 0.01us better for np.array (I think this is negligible)
%timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100000 loops, best for 3 loops: 1.96 us per loop

그럼에도 불구하고.np.argsort★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

슈바르츠식 변혁.내장된 Python 정렬은 안정적이기 때문에, 두 개는1문제가 되지 않습니다.

>>> l1 = [3, 2, 4, 1, 1]
>>> l2 = ['three', 'two', 'four', 'one', 'second one']
>>> zip(*sorted(zip(l1, l2)))
[(1, 1, 2, 3, 4), ('one', 'second one', 'two', 'three', 'four')]

한 가지 방법은 ID [0,1,2,..n]를 정렬하여 각 인덱스가 어디로 이동하는지 추적하는 것입니다.

이것은, 리스트의 수에 관계없이 동작합니다.

그런 다음 각 항목을 제자리로 이동합니다.스플라이스를 사용하는 것이 가장 좋습니다.

list1 = [3,2,4,1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']

index = list(range(len(list1)))
print(index)
'[0, 1, 2, 3, 4]'

index.sort(key = list1.__getitem__)
print(index)
'[3, 4, 1, 0, 2]'

list1[:] = [list1[i] for i in index]
list2[:] = [list2[i] for i in index]

print(list1)
print(list2)
'[1, 1, 2, 3, 4]'
"['one', 'one2', 'two', 'three', 'four']"

목록을 정렬하지 않고 반복할 수도 있습니다.

list1_iter = (list1[i] for i in index)

.zip() ★★★★★★★★★★★★★★★★★」sort()하다

Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
>>> list1 = [3,2,4,1,1]
>>> list2 = ['three', 'two', 'four', 'one', 'one2']
>>> zipped = zip(list1, list2)
>>> zipped.sort()
>>> slist1 = [i for (i, s) in zipped]
>>> slist1
[1, 1, 2, 3, 4]
>>> slist2 = [s for (i, s) in zipped]
>>> slist2
['one', 'one2', 'two', 'three', 'four']

도움이 되었으면 좋겠다

그럼 어떻게 되는 거죠?

list1 = [3,2,4,1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']

sortedRes = sorted(zip(list1, list2), key=lambda x: x[0]) # use 0 or 1 depending on what you want to sort
>>> [(1, 'one'), (1, 'one2'), (2, 'two'), (3, 'three'), (4, 'four')]

를 사용하는 numpy를 사용할 수 .np.argsort정렬된 인덱스를 가져와 목록에 적용합니다.이것은 정렬하는 리스트의 수에 관계없이 기능합니다.

import numpy as np

arr1 = np.array([4,3,1,32,21])
arr2 = arr1 * 10
sorted_idxs = np.argsort(arr1)

print(sorted_idxs)
>>> array([2, 1, 0, 4, 3])

print(arr1[sorted_idxs])
>>> array([ 1,  3,  4, 21, 32])

print(arr2[sorted_idxs])
>>> array([ 10,  30,  40, 210, 320])

list2에 같은 값이 2개 없는 한 sorted() 메서드에서 key 인수를 사용할 수 있습니다.

코드는 다음과 같습니다.

sorted(list2, key = lambda x: list1[list2.index(x)]) 

list1의 대응하는 값에 따라 list2를 정렬하지만 list.index() 함수가 첫 번째 값을 제공하기 때문에 list2의 두 값이 동일하다고 평가되지 않도록 합니다.

다른 목록과 비교하여 정렬할 때 문자열 목록의 순서를 유지하는 또 다른 방법은 다음과 같습니다.

list1 = [3,2,4,1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']

# sort on list1 while retaining order of string list
sorted_list1 = [y for _,y in sorted(zip(list1,list2),key=lambda x: x[0])]
sorted_list2 = sorted(list1)

print(sorted_list1)
print(sorted_list2)

산출량

['one', 'one2', 'two', 'three', 'four']
[1, 1, 2, 3, 4]

2개 이상의 리스트를 동시에 정렬할 필요가 있는 경우는, 솔루션을 제안하고 싶습니다.

def SortAndSyncList_Multi(ListToSort, *ListsToSync):
    y = sorted(zip(ListToSort, zip(*ListsToSync)))
    w = [n for n in zip(*y)]
    return list(w[0]), tuple(list(a) for a in zip(*w[1]))

open jfs의 답변을 확장하고 싶습니다.이 답변은 제 문제에 매우 도움이 됩니다.두 개의 목록을 세 번째, 장식된 목록으로 정렬하는 것입니다.

어떤 방법으로든 장식 목록을 만들 수 있지만, 이 경우 정렬하고 싶은 두 개의 원래 목록 중 하나의 요소에서 만듭니다.

# say we have the following list and we want to sort both by the algorithms name 
# (if we were to sort by the string_list, it would sort by the numerical 
# value in the strings)
string_list = ["0.123 Algo. XYZ", "0.345 Algo. BCD", "0.987 Algo. ABC"]
dict_list = [{"dict_xyz": "XYZ"}, {"dict_bcd": "BCD"}, {"dict_abc": "ABC"}]

# thus we need to create the decorator list, which we can now use to sort
decorated = [text[6:] for text in string_list]  
# decorated list to sort
>>> decorated
['Algo. XYZ', 'Algo. BCD', 'Algo. ABC']

이제 jfs 솔루션을 적용하여 두 목록을 세 번째 순서로 정렬할 수 있습니다.

# create and sort the list of indices
sorted_indices = list(range(len(string_list)))
sorted_indices.sort(key=decorated.__getitem__)

# map sorted indices to the two, original lists
sorted_stringList = list(map(string_list.__getitem__, sorted_indices))
sorted_dictList = list(map(dict_list.__getitem__, sorted_indices))

# output
>>> sorted_stringList
['0.987 Algo. ABC', '0.345 Algo. BCD', '0.123 Algo. XYZ']
>>> sorted_dictList
[{'dict_abc': 'ABC'}, {'dict_bcd': 'BCD'}, {'dict_xyz': 'XYZ'}]
newsource=[];newtarget=[]
for valueT in targetFiles:
    for valueS in sourceFiles:
            l1=len(valueS);l2=len(valueT);
            j=0
            while (j< l1):
                    if (str(valueT) == valueS[j:l1]) :
                            newsource.append(valueS)
                            newtarget.append(valueT)
                    j+=1

알고리즘 솔루션:

list1 = [3,2,4,1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']


lis = [(list1[i], list2[i]) for i in range(len(list1))]
list1.sort()
list2 = [x[1] for i in range(len(list1)) for x in lis if x[0] == i]

출력: -> 출력 속도: 0.2s

>>>list1
>>>[1, 1, 2, 3, 4]
>>>list2
>>>['one', 'one2', 'two', 'three', 'four']

언급URL : https://stackoverflow.com/questions/9764298/how-to-sort-two-lists-which-reference-each-other-in-the-exact-same-way