为什么random.shuffle返回None?
为什么random.shuffle
在Python中返回None
?
>>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> print shuffle(x) None
我如何获得洗牌值而不是None
?
random.shuffle()
更改x
列表。
原地改变结构的Python API方法通常返回None
,而不是修改过的数据结构。
如果你想创build一个基于现有列表的新的随机洗牌列表,在现有列表保持顺序,你可以使用random.sample()
与input的全长:
x = ['foo', 'bar', 'black', 'sheep'] random.sample(x, len(x))
你也可以使用sorted()
和random.random()
作为sorting键:
shuffled = sorted(x, key=lambda k: random.random())
但是这会调用sorting(O(NlogN)操作),而对input长度进行采样只需要O(N)操作(使用与random.shuffle()
相同的进程,从收缩池中交换出随机值)。
演示:
>>> import random >>> x = ['foo', 'bar', 'black', 'sheep'] >>> random.sample(x, len(x)) ['bar', 'sheep', 'black', 'foo'] >>> sorted(x, key=lambda k: random.random()) ['sheep', 'foo', 'black', 'bar'] >>> x ['foo', 'bar', 'black', 'sheep']
我认为这种方法也起作用。
import random shuffled = random.sample(original, len(original))
根据文档 :
将序列x随机混合。 可选参数random是返回[0.0,1.0)中的随机float的0参数函数; 默认情况下,这是函数random()。
>>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> shuffle(x) >>> x ['bar', 'black', 'sheep', 'foo']
shuffle
修改列表。 这很好,因为如果你不需要原来的列表,复制一个大的列表将是纯粹的开销。
根据pythonic风格的“显式优于隐式”原则,返回列表将是一个坏主意,因为那么可能会认为它是一个新的,但实际上并不是这样。
如果你确实需要一个新的列表,你将不得不写一些类似的东西
new_x = list(x) # make a copy random.shuffle(new_x)
这是很明确的。 如果你经常需要这个习惯用法,把它包装在一个函数中(见sorted
),返回new_x
。
我有这样的概念我有一个时刻:
from random import shuffle x = ['foo','black','sheep'] #original list y = list(x) # an independent copy of the original for i in range(5): print shuffle(y) # shuffles the original "in place" prints "None" return print x,y #prints original, and shuffled independent copy >>> None ['foo', 'black', 'sheep'] ['foo', 'black', 'sheep'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo'] None ['foo', 'black', 'sheep'] ['black', 'foo', 'sheep'] None ['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']