如何在生成器上使用random.shuffle()?蟒蛇

发布于 2021-01-29 16:30:58

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

>>> 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()设计为在每次运行脚本后返回相同的输出?

关注者
0
被浏览
88
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为了均匀地随机播放序列,random.shuffle()需要知道输入有多长时间。生成器无法提供此功能;您 必须 将其具体化为一个列表:

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

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

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

    但是由于这 也会 产生一个列表,因此沿这条路线走没什么意义。

    演示:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看