为什么random.shuffle会返回None?

时间:2013-07-15 08:33:41

标签: python list random shuffle

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

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

如何获取混洗值而不是None

9 个答案:

答案 0 :(得分:106)

random.shuffle()更改了x列表

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

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

x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))     

您还可以将sorted()random.random()一起用于排序键:

shuffled = sorted(x, key=lambda k: random.random())

但这会调用排序(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']

答案 1 :(得分:27)

此方法也有效。

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

答案 2 :(得分:8)

根据docs

  

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

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

答案 3 :(得分:5)

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

根据“显式优于隐式”原则pythonic style,返回列表将是一个坏主意,因为那时人们可能会认为一个新的,虽然事实并非如此。

如果你需要一个新的清单,你必须写一些像

这样的东西
new_x = list(x)  # make a copy
random.shuffle(new_x)

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

答案 4 :(得分:1)

我对这个概念有这样的看法:

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

答案 5 :(得分:1)

$('#div-images').empty();
for (var key in data.listImage) {
  var mi = data.listImage[key];
  var image_url = mi.IMAGE_URL;
  var image_tag = '<img id=image' + key + ' width="50" height="50" />';
  $('#div-images').append(image_tag);

  // load image
  var _img = document.getElementById('image' + key);
  var newImg = new Image;
  newImg.onload = function() {
    _img.src = this.src;
  }
  newImg.src = image_url;
}

不会返回任何值。相反,该函数会自动改变变量。

所以不要试试

shuffle(x)

而只是像这样打印变量。

print shuffle(x)

答案 6 :(得分:1)

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

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]

答案 7 :(得分:1)

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

正如指出的那样,random.shuffle会在原处替换,因此您不需要新的列表变量。

答案 8 :(得分:0)

您可以按照其他人的说明使用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]