打乱包含空元素的列表

1 投票
3 回答
2276 浏览
提问于 2025-04-18 06:06

我有一个包含多个列表的列表,这些列表里的值可能是空的(即[])或者是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

撰写回答