为什么random.shuffle会返回None?

alv*_*vas 69 python random shuffle list

为什么要在python中random.shuffle返回None

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None
Run Code Online (Sandbox Code Playgroud)

如何获得洗牌值而不是None

Mar*_*ers 122

random.shuffle()更改x列表到位.

在原地改变结构的Python API方法通常返回None,而不是修改后的数据结构.

如果您想基于现有列表创建一个新的随机混洗列表,其中现有列表按顺序保存,您可以使用random.sample()输入的全长:

x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))     
Run Code Online (Sandbox Code Playgroud)

您还可以使用sorted()with random.random()作为排序键:

shuffled = sorted(x, key=lambda k: random.random())
Run Code Online (Sandbox Code Playgroud)

但是这会调用排序(O(NlogN)操作),而对输入长度的采样只需要进行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']
Run Code Online (Sandbox Code Playgroud)

  • 使用随机值"key"函数真的有保证吗?如果比较不是自洽的,那么一些快速排序算法就会失败.我可以看到这种工作方式,取决于实现(decorate-sort-undecorate只需要在每个元素上应用`key`一次,因此将得到明确定义). (2认同)
  • @torek:Python在使用`key`可调用进行排序时使用decorate-sort-undecorate. (2认同)

Ace*_*mad 31

这种方法也有效.

import random
shuffled = random.sample(original, len(original))
Run Code Online (Sandbox Code Playgroud)


ale*_*cxe 8

根据文件:

将序列x随机移动到位.可选参数random是一个0参数函数,在[0.0,1.0)中返回随机浮点数; 默认情况下,这是函数random().

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']
Run Code Online (Sandbox Code Playgroud)


Lut*_*elt 5

shuffle修改列表到位.这很好,因为如果您不再需要原始列表,复制大型列表将是纯粹的开销.

根据pythonic风格"明确优于隐式"原则,返回列表将是一个坏主意,因为那时人们可能认为它一个新的,虽然实际上它不是.

如果你确实需要一个新的清单,你将不得不写一些类似的东西

new_x = list(x)  # make a copy
random.shuffle(new_x)
Run Code Online (Sandbox Code Playgroud)

这很明确.如果您经常需要这个习语,请将其包装在返回的函数shuffled(请参阅参考资料sorted)中new_x.