为什么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']