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)
Ace*_*mad 31
这种方法也有效.
import random
shuffled = random.sample(original, len(original))
Run Code Online (Sandbox Code Playgroud)
根据文件:
将序列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)
shuffle修改列表到位.这很好,因为如果您不再需要原始列表,复制大型列表将是纯粹的开销.
根据pythonic风格的"明确优于隐式"原则,返回列表将是一个坏主意,因为那时人们可能认为它是一个新的,虽然实际上它不是.
如果你确实需要一个新的清单,你将不得不写一些类似的东西
new_x = list(x) # make a copy
random.shuffle(new_x)
Run Code Online (Sandbox Code Playgroud)
这很明确.如果您经常需要这个习语,请将其包装在返回的函数shuffled(请参阅参考资料sorted)中new_x.
| 归档时间: |
|
| 查看次数: |
51379 次 |
| 最近记录: |