Python 将没有返回值的方法应用于列表的每个元素

Python 将没有返回值的方法应用于列表的每个元素,python,list-comprehension,Python,List Comprehension,有没有一种方法可以在列表中使用无返回值的方法,例如random.shuffle >>> import pprint >>> import random >>> >>> L = [ random.shuffle(range(5)) for x in range(5)] >>> >>> print L [None, None, None, None, None] 这是将random.sh

有没有一种方法可以在列表中使用无返回值的方法,例如random.shuffle

>>> import pprint
>>> import random
>>> 
>>> L = [ random.shuffle(range(5)) for x in range(5)]
>>> 
>>> print L
[None, None, None, None, None]
这是将random.shuffle方法应用于我列表中每个项目的for循环:

>>> L = [ range(5) for x in range(5) ]
>>> pprint.pprint(L)
[[0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4]]
>>> for element in L:
...     random.shuffle(element)
... 
>>> pprint.pprint(L)
[[2, 0, 3, 1, 4],
 [2, 0, 1, 4, 3],
 [4, 1, 3, 0, 2],
 [1, 2, 4, 3, 0],
 [1, 3, 0, 2, 4]]
我可以使用map,它会对原始列表进行洗牌,但会返回一个
None

>>> L = [ range(5) for x in range(5) ]
>>> pprint.pprint(L)
[[0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4]]
>>> map(random.shuffle, L)
[None, None, None, None, None]
>>> pprint.pprint(L)
[[3, 0, 4, 1, 2],
 [2, 3, 0, 1, 4],
 [2, 3, 1, 4, 0],
 [4, 2, 0, 3, 1],
 [1, 3, 0, 2, 4]]
与使用列表理解和随机播放一样:

>>> L = [ range(5) for x in range(5) ]
>>> pprint.pprint(L)
[[0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4]]
>>> L1 = [ random.shuffle(x) for x in L ]
>>> pprint.pprint(L1)
[None, None, None, None, None]
>>> pprint.pprint(L)
[[1, 4, 0, 2, 3],
 [0, 4, 1, 3, 2],
 [2, 3, 4, 0, 1],
 [4, 1, 0, 2, 3],
 [2, 0, 4, 3, 1]]
关于堆栈溢出的许多问题和答案已经指出,使用map或lc处理副作用是不好的做法。我想知道是否有正确的方法可以在列表中使用没有返回值的方法

编写方法来包装非返回方法是否是唯一的方法:

>>> def shuffled(L):
...     ret_val = L[:]
...     random.shuffle(ret_val)
...     return ret_val
... 
>>> L = [ shuffled(range(5)) for x in range(5)]
>>> pprint.pprint(L)
[[2, 1, 0, 4, 3],
 [4, 0, 3, 1, 2],
 [4, 2, 3, 0, 1],
 [1, 0, 4, 2, 3],
 [2, 4, 3, 0, 1]]
>>> 

No-list理解用于具有返回值的函数。这就是它们的语义:

列表理解提供了一个简洁的 创建列表而无需诉诸 使用map()、filter()和/或 拉姆达。生成的列表定义 往往比列表更清晰 使用这些构造构建。每个 列表理解包括 表达式后跟for子句, 然后零个或多个for或if子句。 结果将是一个列表 从计算 for和if子句的上下文 接下来是什么

读过这篇文章后,应该很清楚,“从没有返回值的函数中理解列表”是一个矛盾修饰法

只需使用
for
循环即可实现“一次性”:


干净简单。您的
shuffled
函数也很好,可以用于列表理解。

Eli非常正确。但我会选择更简洁的:

import random

L = [range(5) for each in xrange(5)]
for each in L:
    random.shuffle(each)
[编辑]

o您可以使用
random.sample()


我喜欢你的
shuffled
方法,在列表中使用它!相关的:
import random

L = [range(5) for each in xrange(5)]
for each in L:
    random.shuffle(each)
from random import sample

xr = xrange(5)
L = [sample(xr, 5) for each in xr]