Python列表不会循环播放

时间:2011-01-25 14:31:24

标签: python random for-loop

我正在尝试通过迭代创建一个随机的密钥列表:

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次相同的洗牌?!显然这里有些根本错误......提前谢谢。

2 个答案:

答案 0 :(得分:16)

问题在于您正在对列表进行混洗,然后将列表的引用添加到组合列表中。因此,您最终会使用相同的列表结构10次。 “基本变化”是必须在附加之前复制列表。

这是使用列表理解获得相同结果的更多“pythonic”方法。

import random

def shuffleACopy(x):
        b = x[:] # make a copy of the keys
        random.shuffle(b) # shuffle the copy
        return b # return the copy

keys = [1,2,3,4,5,6,7,8]
a = [shuffleACopy(keys) for x in range(10)]
print(a)

答案 1 :(得分:3)

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没有返回任何内容,您可以开始怀疑转换已在中完成