2014-03-01 1 views
0

목록을 셔플하는 방법을 알았지 만 원래 첫 번째 항목을 제외한 모든 항목을 뒤섞는 것처럼 보입니다.목록의 첫 번째 항목을 셔플하지 않음

내 코드 :

from random import shuffle 

x = list(range(10)) 
print x 

k = 0 
while k < len(x): 
    for i in x: 
     shuffle(x) 
     print i 
     k = k + 1 

이유 나는 잠시 루프 내에서 루프를 위해 나는 결국 최종 목록을 통해 반복 할 것입니다 사용하고, 나는이 있는지 확실하지 않습니다 for-loop 자체 내에서 수행 될 수 있습니다.

코드를 실행하면 원래 목록이 인쇄되고 그 다음에 목록의 각 항목이 인쇄됩니다. 첫 번째 항목은 항상 0으로 표시됩니다. 즉, 항상 원래 목록의 첫 번째 항목입니다. Shuffle 함수가 호출되기 전에 아이템이 이미 "선택"되었기 때문에 이것이 발생하는 이유를 알 수 없습니다. 이 경우에 for-loop가 나오기 전에리스트를 뒤섞어서 각 아이템이 인쇄 된 후에 섞이게되는 대신 한 번만 셔플됩니다.

누구나 내가 인쇄하기 전에 첫 번째 항목을 어떻게 섞을 지 알 수 있습니까? 감사!

+3

'셔플'전체 목록을 뒤섞습니다. 왜 당신은 한 번이 아니라 여러 번 그것을 뒤섞고 있습니까? – BrenBarn

+0

나는 워드와 그 정의로 구성된 튜플 인 어휘 카드 연습을위한 스크립트를 만들고자한다. 각 "카드"를 읽은 후 뒤섞어 카드가 패턴으로 설정되는 것을 피할 수 있습니다. – Streeting

+0

고마워, @thefourtheye! 그게 효과가있는 것 같아! – Streeting

답변

1

그냥

shuffle(x) 
for item in x: 
    print item 

없음 while 루프를 사용합니다. 개편하지 않아. 실제 플래시 카드로 해본 것처럼 마치 셔플 한 번하고 셔플로받은 순서대로 카드를 선물하십시오. 때문에

for i in x: 
    shuffle(x) 
    print i 
    k = k + 1 

i의 첫 번째 반복에

당신은 당신이 버그를보고있는

는 셔플 전에 할당됩니다. 다음 반복 때까지 순서 섞인 순서를 사용하지 않습니다.

+0

그러나 while 루프를 사용하는 이유는'list.remove (item) '을 사용하는 동안 목록을 반복 할 수 있었기 때문에 일련의 통과를 통해 목록을 축소 시켰기 때문입니다. – Streeting