programing

목록을 다시 정렬하려면 어떻게 해야 합니까?

elecom 2023. 7. 22. 09:23
반응형

목록을 다시 정렬하려면 어떻게 해야 합니까?

의 의의크기배열지이정다니됩임▁of▁an다▁given니▁array지가 주어집니다.n배열의 이산 인덱스를 기준으로 배열 요소를 재구성하려고 합니다.

파이썬의 예:

# Unique array of size n
[ "a", "b", "c", "d", "e", ... <n> ]

# Indices of array
[ 0, 1, 2, 3, 4, ... <index_of_n> ]

# Desired re-organization function 'indexMove'
indexMove(
    [ "a", "b", "c", "d", "e", ... <n> ],
    [ <index_of_n>, 4, 0, 2, 3, ... 1 ]
)

# Desired output from indexMove operation
[ <n>, "e", "a", "c", "d", ... "b" ]

이 작업을 수행하는 가장 빠른 방법은 무엇입니까(가장 작은 시간 복잡도 달성)?

이렇게 하면 됩니다.

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

최종 순서가 지수 목록에 의해 정의됩니까?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

편집: meh.AJ가 더 빨랐어요...파이썬에서 목록을 다시 정렬하려면 어떻게 해야 합니까?

>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']

사용자 고유의 정렬 기능을 제공할 수 있습니다.

sort() 메서드는 비교를 제어하기 위한 선택적 인수를 사용합니다.

  • cmp는 첫 번째 인수가 두 번째 인수보다 작거나 같거나 큰 것으로 간주되는지 여부에 따라 음수, 0 또는 양수를 반환해야 하는 두 인수(목록 항목)의 사용자 지정 비교 함수를 지정합니다.cmp=lambda x,y: cmp(x.lower(), y.lower())은 기값은 입다니입니다.None.

  • key는 각 목록 요소에서 비교 키를 추출하는 데 사용되는 하나의 인수 함수를 지정합니다.key=str.lower은 기값은 입다니입니다.None.

  • reverse는 부울 값입니다.True로 설정하면 목록 요소가 각 비교가 반대인 것처럼 정렬됩니다.

일반적으로 키 및 역변환 프로세스는 동등한 cmp 함수를 지정하는 것보다 훨씬 빠릅니다.이는 cmp가 각 목록 요소에 대해 여러 번 호출되는 반면 키와 역방향은 각 요소를 한 번만 터치하기 때문입니다.

Numpy를 사용하면 멋진 방법이 있습니다.

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

이 코드는 다음을 반환합니다.

[1 3 2 0]
['b' 'd' 'c' 'a']

효율성에 대해 크게 신경 쓰지 않는 경우 numpy의 어레이 인덱싱을 사용하여 우아하게 만들 수 있습니다.

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )

한 가지 더 고려할 수 있는 것은 다크리스가 지적한 다른 해석입니다.

파이썬 2.7의 코드

주로:

  1. 값별 재주문 - 위의 AJ에서 이미 해결했습니다.
  2. 인덱스별 순서 변경

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]
    

['c', 'd', 'b', 'a', 'e']가 인쇄됩니다.

제가 당신의 질문에 대해 이해한 바로는, 당신이 지정한 순열을 적용하기를 원하는 것 같습니다.list이 작업은 다른 항목을 지정하여 수행됩니다.list(이것으로 끝냅시다.p원본 요소의 인덱스를 보유하는 것.list순열에 나타나야 하는 것.list그런 다음 사용합니다.p새로 만들기 위해list단순히 각 위치의 요소를 지수가 해당 위치에 있는 요소로 대체함으로써.p.

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

인쇄합니다.['d', 'c', 'a', 'b', 'e'].

이것은 실제로 새로운 것을 만듭니다.list그러나 원래의 "in place"를 영구화하기 위해 약간 수정할 수 있습니다.

newList = [oldList[3]]
newList.extend(oldList[:3])
newList.extend(oldList[4:])

이것은 제가 이 문제를 우연히 발견했을 때 사용한 것입니다.

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: 소문자의 경우

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

지정된 인덱스로 목록을 이동하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/2177590/how-can-i-reorder-a-list

반응형