Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么random.shuffle返回None?_Python_List_Random_Shuffle - Fatal编程技术网

Python 为什么random.shuffle返回None?

Python 为什么random.shuffle返回None?,python,list,random,shuffle,Python,List,Random,Shuffle,为什么Python中的random.shuffle返回None >>> x = ['foo','bar','black','sheep'] >>> from random import shuffle >>> print shuffle(x) None 如何获得无序值而不是None?更改x列表 修改结构的Python API方法通常返回None,而不是修改后的数据结构 >>> x = ['foo', 'bar', 'bla

为什么Python中的
random.shuffle
返回
None

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None
如何获得无序值而不是
None

更改
x
列表

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

>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.shuffle(x)
>>> x
['black', 'bar', 'sheep', 'foo']

如果您希望基于现有列表创建一个新的随机无序列表,其中现有列表保持有序,您可以使用输入的完整长度:

random.sample(x, len(x))     
您还可以使用with作为排序键:

shuffled = sorted(x, key=lambda k: random.random())
但这会调用排序(一个O(N log N)操作),而对输入长度的采样只需要O(N)个操作(使用与
random.shuffle()相同的过程,从收缩池中交换出随机值)

演示:

根据:

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

为什么,真的? 1.效率
shuffle
就地修改列表。 这很好,因为如果您不再需要原始列表,那么复制一个大列表将是纯粹的开销

2.肾盂式 根据“显式优于隐式”的原则,返回列表将是一个坏主意,因为这样人们可能会认为它是一个新的列表,尽管事实并非如此

但我不喜欢这样! 如果你真的需要一个新的列表,你必须写一些类似的东西

new_x = list(x)  # make a copy
random.shuffle(new_x)
这是非常明确的。 如果您经常需要此习惯用法,请将其包装在一个函数
shuffled
(请参阅
sorted
)中,该函数返回
new\u x

,此方法也适用

import random
shuffled = random.sample(original, len(original))

我有过这样的想法:

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']

您可以使用其他人解释的
random.sample()
返回无序列表。它通过从列表中采样k个元素而不替换来工作。 因此,如果列表中有重复的元素,它们将被唯一地处理

>>> l = [1,4,5,3,5]
>>> random.sample(l,len(l))
[4, 5, 5, 3, 1]
>>> random.sample(l,len(l)-1)
[4, 1, 5, 3]
>>> random.sample(l,len(l)-1)
[3, 5, 5, 1]

更改结构的Python API本身将返回None作为输出

list = [1,2,3,4,5,6,7,8]
print(list)
输出:[1,2,3,4,5,6,7,8]

from random import shuffle
print(shuffle(list))
输出:无

from random import sample
print(sample(list, len(list)))

输出:[7,3,2,4,5,6,1,8]

相关:也相关:使用随机值
函数真的有保证吗?如果比较不自一致,一些快速排序算法就会失效。我可以看到这两种方法都可以工作,具体取决于实现(修饰排序取消修饰只需要在每个元素上应用
一次,因此将得到很好的定义)。@torek:Python在使用
可调用的排序时使用修饰排序取消修饰。因此,是的,保证每个值只被赋予随机键一次。因为Python“按值复制”默认情况下,而不是按引用传递=)
from random import shuffle
print(shuffle(list))
from random import sample
print(sample(list, len(list)))