2014-05-10 37 views
1

我有列出一些名单,并将其值可以是空的[]或NoneType空(或无)元素洗牌名单

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

,我需要他们随机化。例如,获得[[1, None], 4, 2, [[], 3], [[]]]

但是,如果使用随机(LST)我有一个例外:

TypeError: 'NoneType' object is not iterable 

UPD: 我的错误是,我尝试把结果变成变量

newLst = shuffle(lst) 

那我们给NoneType对象。

+3

不能与'random.shuffle'重现:http://codepad.org/96uO6FJC。也许向我们展示'shuffle'功能? – vaultah

+0

还要注意'random.shuffle'就地改变了列表,所以它什么都没有返回('None')。如果你想遍历结果列表,只需要'for x in lst'而不是'in shuffle(lst)' – vaultah

+0

好吧,谢谢抱歉=)我的错误是我试图把结果放入变量中 - 那是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

你想确保你在打印或分配之前就地洗牌。

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

高兴你找到了答案(即random.shuffle修改就地列表并返回None) - 但是,如果你想离开列表未修改,并得到一个“洗牌”的结果,则:

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

会为你做到这一点。

+0

但是可以在O(N)中完成混洗,排序将使它成为O(N lg N)。 – thefourtheye

+0

@thefourtheye true ...但仍然比复制列表更便宜,洗牌然后返回...这都是折衷:) –