如何在生成器上使用random.shuffle()? Python [英] How to use random.shuffle() on a generator? python

查看:102
本文介绍了如何在生成器上使用random.shuffle()? Python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在不初始化生成器列表的情况下在生成器上使用random.shuffle()? 那有可能吗?如果不是,我还应该在列表上使用random.shuffle()吗?

How do I use random.shuffle() on a generator without initializing a list from the generator? Is that even possible? if not, how else should I use random.shuffle() on my list?

>>> import random
>>> random.seed(2)
>>> x = [1,2,3,4,5,6,7,8,9]
>>> def yielding(ls):
...     for i in ls:
...             yield i
... 
>>> for i in random.shuffle(yielding(x)):
...     print i
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/random.py", line 287, in shuffle
    for i in reversed(xrange(1, len(x))):
TypeError: object of type 'generator' has no len()

注意:random.seed()的设计使其在每次运行脚本后都返回相同的输出?

Note: random.seed() was designed such that it returns the same output after each script run?

推荐答案

为了统一改组序列,random.shuffle()需要知道输入有多长时间.生成器无法提供此功能;您已经将其具体化为一个列表:

In order to shuffle the sequence uniformly, random.shuffle() needs to know how long the input is. A generator cannot provide this; you have to materialize it into a list:

lst = list(yielding(x))
random.shuffle(lst)
for i in lst:
    print i

您可以改用sorted()random.random()作为键:

for i in sorted(yielding(x), key=lambda k: random.random()):
    print i

但由于此会产生一个列表,所以沿这条路线走没什么意义.

but since this also produces a list, there is little point in going this route.

演示:

>>> import random
>>> x = [1,2,3,4,5,6,7,8,9]
>>> sorted(iter(x), key=lambda k: random.random())
[9, 7, 3, 2, 5, 4, 6, 1, 8]

这篇关于如何在生成器上使用random.shuffle()? Python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆