2012-01-20 5 views
3

기본적으로 목록의 순열은 거의 필요 없습니다. 그래서, 내가 사용했던 방법은 순열을 얻기 위해 목록 문자열을 무작위로 섞어서 목록에 추가하는 반면 목록에 동일한 순열이 있는지 확인합니다. 수 표를 구현할 수 없습니다. 여기에 제가 작성한 코드가 있습니다.목록이 파이썬 목록 목록에 있는지 확인 테스트

list = [x for x in range(0,max)] 
totalperm = 10 
perms = [] 
while(len(perms) <> totalperm): 
    random.shuffle(list)   
    if list not in perms: 
     perms.append(list)    

여기에 무엇이 누락되어 있는지 알려 주시기 바랍니다.

답변

2

당신은 하나의리스트에 대한 참조 전체 시간에 최선을 다하고 있기 때문에 첫 번째 후 목록에 항상 그래서이 작동하지 않습니다 추가 할 시간.

고려 :

perms = [] 
items = [1, 2, 3] 
random.shuffle(mylist) # perhaps items is now [2, 1, 3] 
perms.append(items)  # perms is now [[2, 1, 3]] 
random.shuffle(mylist) # perhaps items is now [1, 3, 2] 
perms.append(items)  # now what is perms? 

대답은, 그 정도로 perms는 단일리스트 개의 참조가 [1, 3, 2], [1, 3, 2].

코드에서 itemsperms[0]은 같은 개체이며 동일한 값입니다. 따라서 itemsperms에 있는지 묻는다면 대답은 항상 예입니다. 네가 거기에 넣었으니!

해결책은 간단합니다. 목록 사본을 추가하십시오.

perms.append(items[:]) 

그건 그렇고, 당신은 아마 set 오히려 순열을 저장하기위한 list (A)보다를 사용해야합니다. set의 회원을 확인하는 것이 훨씬 빠르며 중복 추가 시도는 무시됩니다. 단 한 가지 단점은 목록이 변경 가능하고 따라서 해쉬 할 수 없으므로 목록을 set에 넣을 수 없다는 것입니다. 다행히도, 불변의 해시 가능 튜플로 변환 할 수 있습니다. 그렇다면 :

items = range(0, max) # Python 3: items = list(range(0, max)) 
perms = set() 
nump = 10 
while len(perms) < nump: 
    random.shuffle(items) 
    perms.add(tuple(items)) 
+1

목록에 집합을 추가 할 수 없습니다. 집합에 목록을 추가 할 수 없습니다 (변경 가능). 'items [:]'대신'tuple (items)'을 사용하십시오. –

+0

감사합니다. 이것은 나를 위해 작동합니다. –

+0

롭 : 그래, 나는 그것을 잊어 버린 것을 믿을 수 없다. 결정된! – kindall

3

목록을 섞으면 위치가 변경됩니다. 나중에 에 대한 참조를 perm의 목록에 추가하십시오. 다음에 루프를 반복하면서 목록을 다시 섞습니다. perms를 보면 원래 목록에 대한 n 개의 참조가 포함됩니다.

당신은 아마이 대신 같은 것을하고 싶지 : 나를 위해

shuffled = list[:] 
random.shuffle(shuffled) 
if shuffled not in perms: 
    perms.append(shuffled) 
+0

심지어, 당신이 그랬던 것처럼 같은 생각.그래서, 나는 다음을했다 : '파마의 = [] 동안 (LEN (파마) <> totalperm) : listnew = 목록 random.shuffle (listnew) 하지 파마에 listnew 경우 : (listnew) perms.append print perms del listnew '그러나 이것은 작동하지 않습니다. –

+0

listnew = list는 작동하지 않습니다. 목록을 명시 적으로 복사하려면 listnew = list [:]가 필요합니다. –

+0

@AnandGupta,'listnew = list'는 목록 사본을 만들지 않고, * 같은 * 목록. 'listnew = list [:]'가 필요합니다. 필자는 훨씬 더 파이썬적인'set' 예제를 살펴볼 것입니다. –

1

[1,2,3] in [[1,2,3], [4,5,6]] == True

작품. 이 코드가 전부입니까?

+1

변수에 목록을 저장 한 다음 확인하면이 기능이 작동하지 않습니다. –

4

를 사용하여 중복을 방지하기 위해 파이썬의 내장 set :

perms = set() 
while len(perms) != totalperm: 
    random.shuffle(lst)   
    perms.add(tuple(lst)) 
0

list을 변경하면 코드가 무한 루프가됩니다. 그렇다면 당신은 그것이 perms에 있는지, 큰 놀람인지 테스트합니다! 따라서 perms을 추가 할 수 없습니다.

광고 nauseum 반복.

여기에 어떻게 내가 해냈어 :

import random 
max = 4 

list = [x for x in range(0, max)] 

totalperm = 10 
perms = [] 
while(len(perms) < totalperm): 
    copiedlist = list[:] 
    random.shuffle(copiedlist)  
    if copiedlist not in perms: 
     perms.append(copiedlist) 
     print perms 
    else: 
     print "It's already there, egads!" 
관련 문제