【问题标题】:Python list does not shuffle in a loopPython列表不会在循环中随机播放
【发布时间】:2011-06-15 05:53:09
【问题描述】:

我正在尝试通过迭代来创建随机键列表:

import random

keys = ['1', '2', '3', '4', '5']
random.shuffle(keys)
print keys

这很完美。但是,如果我把它放在一个循环中并捕获输出:

a = []
for x in range(10):
    random.shuffle(keys)
    a.append(keys)

我得到了 10 次相同的随机播放?!显然这里有一些根本性的错误......在此先感谢。

【问题讨论】:

    标签: python random for-loop


    【解决方案1】:

    Hypnos 已经回答了一个非常正确的解决方案,所以我只是给你一个更直观的方式来了解发生了什么以及如何在未来发现这些事情:

    import random
    keys = ['1', '2', '3', '4', '5']
    a = []
    for x in range(10):
        random.shuffle(keys)
        a.append(keys)
        print a
    

    给予:

    [['4', '5', '3', '2', '1']]
    [['2', '5', '1', '4', '3'], ['2', '5', '1', '4', '3']]
    [['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3']]
    [['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2']]
    [['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5']]
    [['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5']]
    [['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3']]
    [['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1']]
    [['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1']]
    [['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1']]
    

    此外,注意到random.shuffle 没有返回任何内容,您可以开始怀疑转换是在就地完成

    【讨论】:

      【解决方案2】:

      问题是您将列表改组,然后将列表的 reference 添加到组合列表中。因此,您最终会得到 10 次相同的列表结构。 “根本变化”是列表必须在添加之前复制。

      这里有一个更“pythonic”的方式来实现与列表理解相同的结果。

      随机导入 def shuffleACopy(x): b = x[:] # 复制密钥 random.shuffle(b) # 随机播放副本 return b # 返回副本 键 = [1,2,3,4,5,6,7,8] a = [shuffleACopy(keys) for x in range(10)] 打印(一)

      【讨论】:

      • 掌心 现在看来很明显了。非常感谢!
      • 另一种pythonic方式:[random.sample(keys, 5) for _ in range(10)]
      • 被它打败了again
      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2014-04-02
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多