打乱包含空元素的列表
我有一个包含多个列表的列表,这些列表里的值可能是空的(即[])或者是NoneType。
lst = [[[]], [1, None], 2, [[], 3], 4]
我需要把它们随机打乱。比如说,想得到 [[1, None], 4, 2, [[], 3], [[]]]
这样的结果。
但是如果我用shuffle(lst)来打乱,就会出现一个错误:
TypeError: 'NoneType' object is not iterable
更新:
我犯的错误是试图把结果放到一个变量里。
newLst = shuffle(lst)
这导致了得到一个NoneType对象。
3 个回答
0
很高兴你找到了答案(也就是 random.shuffle
会直接修改列表,并且返回 None
)——不过,如果你想保持列表不变,同时得到一个“打乱”的结果,那么:
import random
shuffled = sorted(lst, key=lambda L: random.random())
这个方法可以帮你实现。
1
你需要确保在打印或赋值之前先进行原地洗牌。
>>> from random import shuffle
>>> lst = [[[]], [1, None], 2, [[], 3], 4]
>>> shuffle(lst)
>>> print(lst)
[2, 4, [[], 3], [1, None], [[]]]
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