목록을 다시 정렬하려면 어떻게 해야 합니까?
의 의의크기배열지이정다니됩임▁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의 코드
주로:
- 값별 재주문 - 위의 AJ에서 이미 해결했습니다.
인덱스별 순서 변경
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
'programing' 카테고리의 다른 글
| null이 아닌 마지막 양으로 null 값 채우기 - Oracle SQL (0) | 2023.07.22 |
|---|---|
| Spring boot: HTML5Mode와 함께 작동하도록 Tomcat 서버 구성 (0) | 2023.07.22 |
| 오라클에서 두 번 이상 발생한 기록을 검색하는 방법은 무엇입니까? (0) | 2023.07.22 |
| maven Failsafe가 java.lang에서 실패합니다.클래스 정의를 찾을 수 없음 오류 (0) | 2023.07.22 |
| 셸 스크립트에서 mariadb 암호의 특수 문자를 이스케이프하는 방법 (0) | 2023.07.22 |