如何将列表洗牌6次?

时间:2014-10-17 06:15:23

标签: python list random-sample

我想要将名单洗牌6次,但我在所有6次中都获得了相同的结果。有人可以帮我找出故障的位置吗?

这是我使用的代码

import random
lis1=[0,1,2,3]
lis2=[]
for i in range(6):
    random.shuffle(lis1)
    lis2.append(lis1)
print lis2

这是我得到的样本结果

[[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0],[1,3,2,0]]

如果我得到混乱的列表,我怎么能按升序排序?就像在,我想得到这个 -

[[0,1,2,3],[2,3,1,0],[2,1,3,0],[1,0,3,2]]

进入 -

[[0,1,2,3],[1,0,3,2],[2,1,3,0],[2,3,1,0]]

4 个答案:

答案 0 :(得分:4)

首先,您的代码会重复向lis1插入lis2引用。由于lis1始终保持不变,因此所有lis2元素最终都指向同一个对象。要解决此问题,您需要更改append()行,以便每次都复制列表:

lis2.append(lis1[:])

现在,要对结果进行排序,只需在循环后调用sort()

lis2.sort()

答案 1 :(得分:2)

尝试更简单的方法:

>>> first = [0,1,2,3]
>>> jumbled = [random.sample(first, len(first)) for i in range(6)]
>>> ordered = sorted(jumbled)
>>> jumbled
[[0, 3, 2, 1], [1, 0, 2, 3], [0, 2, 1, 3], [0, 1, 2, 3], [0, 2, 3, 1], [0, 3, 2, 1]]
>>> ordered
[[0, 1, 2, 3], [0, 2, 1, 3], [0, 2, 3, 1], [0, 3, 2, 1], [0, 3, 2, 1], [1, 0, 2, 3]]

答案 2 :(得分:2)

存储lis1不是实际lis1的副本    这样做:

lis2.append(lis1[:])

然后代码将是:

import random
lis1=[0,1,2,3]
lis2=[]
for i in range(6):
    random.shuffle(lis1)
    lis2.append(lis1[:])

print lis2

输出:

[[2, 3, 1, 0], [0, 3, 2, 1], [3, 0, 1, 2], [1, 2, 0, 3], [3, 0, 2, 1], [1, 0, 3, 2]]

答案 3 :(得分:0)

import random
lis1=[0,1,2,3]
lis2=[]
for i in range(6):
    r = random.randint(0,len(lis1))
    #print(r)
    lis2.append(lis1[r:]+lis1[:r])
print(lis2)
print(sorted(lis2))