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


107

목록이 있으면 [a,b,c,d,e]어떻게 항목을 임의의 방식으로 재정렬 할 수 [d,c,a,b,e]있습니까?

편집 : 나는 그들을 섞고 싶지 않습니다. 미리 정의 된 방식으로 다시 정렬하고 싶습니다. (예를 들어 이전 목록의 세 번째 요소가 새 목록의 첫 번째 요소가되어야한다는 것을 알고 있습니다.)



4
주문 방법 을 지정하지 않고 는 대답하기가 어렵습니다. 정렬 하시겠습니까? 셔플 하시겠습니까? 일부를 제거 하시겠습니까?
Mizipzor

@tvanfosson :이 경우 임의의 의미는 임의의 (하지만 잘 정의 된) 정렬 기능을 사용하는 것입니다.
Felix Kling

1
@mizipzor 미리 정의 된 방식으로 다시 정렬하고 싶습니다. (이를 명확히하기 위해 질문 수정)
Niyaz

@SilentGhost 새 색인이 생깁니다. 4 일 수 있습니다. 요점은 항목의 새로운 순서를 알고 있다는 것입니다.
Niyaz

답변:


226

이렇게 할 수 있습니다

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']

이렇게하면 새 변수가 생성됩니다. 목록을 제자리에서 다시 정렬하는 방법은 무엇입니까? 감사합니다
혼란 스러움

@Confounded 간단히 마지막 줄을 다음과 같이 변경하십시오.mylist[:] = [mylist[i] for i in myorder]
Adam


11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

@ wenlibin02, 2.7.5에서 실행했지만 여전히 잘 작동합니다. 어떤 종류의 오류가 발생합니까?
Mark

오류없이 입력합니다. 1) 임의 가져 오기; x = [1, 2, 3]; random.shuffle (x); #None을 반환합니다. 2) np.random.shuffle을 시도했습니다. 결과는 동일합니다.
Libin Wen

아, 미안! x의 값을 직접 변경한다는 것을 몰랐습니다. None을 반환했습니다. 그리고 작동합니다. 감사.
Libin Wen 2015


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

2

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

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

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

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

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

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


2
그리고 이것을 정확히 어떻게 구현 하시겠습니까?
SilentGhost

@SilentGhost : 이것은 일반적인 대답을 의미합니다. OP의 경우 답변이 더 적절합니다. 그럼에도 불구하고 일반적인 솔루션이 존재한다는 것을 아는 것이 중요하다고 생각합니다.
Felix Kling

2

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']

1
OP는 일반적인 셔플이 아닌 특정 재정렬을 찾고 있습니다.
Teepeemm

2

효율성에 그다지 신경 쓰지 않는다면 numpy의 배열 인덱싱을 사용하여 우아하게 만들 수 있습니다.

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

1

귀하의 질문에 대해 이해 한 바에 따르면 .NET Framework에서 지정한 순열을 적용하려는 것으로 보입니다 list. 이것은 permuted에 나타나야 하는 원본 요소의 인덱스를 보유 하는 다른 list(그것을 호출하자 p) 지정함으로써 이루어집니다 . 그런 다음를 사용 하여 각 위치의 요소를의 해당 위치에있는 인덱스로 간단히 대체하여 새 항목을 만듭니다 .listlistplistp

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하지만 원래의 "제자리"를 영구히 변경하기 위해 사소하게 수정할 수 있습니다.


1

고려할 수있는 한 가지 더는 darkless가 지적한 다른 해석입니다.

Python 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']가 인쇄됩니다.



-1

이 문제를 발견했을 때 사용한 것입니다.

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

예 : 소문자의 경우

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

단순히 목록을 지정된 인덱스로 이동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.