2014-05-10 2 views
1

나는 목록의 일부 목록을 가지고 있으며 [] 또는 NoneType셔플 목록

lst = [[[]], [1, None], 2, [[], 3], 4] 

비어있을 수 값 그리고 내가 그들을 randomise해야합니다. 예를 들어 [[1, None], 4, 2, [[], 3], [[]]]을 얻으려면.

TypeError: 'NoneType' object is not iterable 

UPD : 나는 셔플 (LST)을 사용하는 경우

는하지만 예외가있어 내 실수는 내가 줘 변수

newLst = shuffle(lst) 

에 결과를 넣어하려고이었다 NoneType 객체입니다.

+3

가 random.shuffle''로 재현 할 수 없습니다 : http://codepad.org/96uO6FJC 여기

는이 문제를 해결할 수있는 방법입니다. 아마도 우리에게'셔플 '기능을 보여줄 것인가? – vaultah

+0

또한 'random.shuffle'은 목록을 현재 위치에서 변경하므로 아무 것도 반환하지 않습니다 ('None'). 결과 목록을 반복하고 싶다면'for x in shuffle (lst) '대신'for x in lst'를 사용하십시오. – vaultah

+0

Ok, thanks and sorry =) 제 실수는 결과를 변수에 넣으려고합니다. 그게 NoneType 객체였습니다 –

답변

0

:

문제는 어떻게 random.shuffle 작품의 오해입니다. None 인 반환 값을 반복하려고 시도했습니다. shuffle이 아무 것도 반환하지 않고 해당 인수를 내부에서 변경하기 때문입니다.

lst = [[[]], [1, None], 2, [[], 3], 4] 
shuffle(lst) # Don't capture the return value 
# lst is now shuffled and you can put it into `for` loop: 
for x in lst: 
    # something 
1

인쇄 또는 할당 전에 위치를 임의로 바꾸고 싶습니다. 당신이 (random.shuffle이 자리에서 목록을 수정하고 None을 반환) 답을 발견

>>> from random import shuffle 
>>> lst = [[[]], [1, None], 2, [[], 3], 4] 
>>> shuffle(lst) 
>>> print(lst) 
[2, 4, [[], 3], [1, None], [[]]] 
0

다행 - 그러나, 당신은 다음 "셔플"그 결과, 수정되지 않은 목록을 떠나 얻고 싶었다 경우 :

import random 
shuffled = sorted(lst, key=lambda L: random.random()) 

그렇게 해드릴 것입니다. 코멘트에서

+0

하지만 셔플 링은 O (N)에서 수행 할 수 있습니다. 정렬을하면 O (N lg N)이됩니다. – thefourtheye

+0

@thefourtheye true ...하지만 목록을 복제하는 것보다 비용이 저렴하고 돌아 오는 순서를 바꾸는 것 ... 모두 상충 관계에 있습니다 :) –