Python 如何将列表洗牌6次?
我想洗牌一张名单6次,但我一直得到相同的结果,所有6次。有人能帮我找出毛病在哪里吗 这是我使用的代码Python 如何将列表洗牌6次?,python,list,random-sample,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]] 如果我得到了混乱
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]]
尝试更简单的方法:
>>> 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]]
尝试更简单的方法:
>>> 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]]
存储
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]]
存储
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]]
首先,您的代码反复将
lis1
引用插入lis2
。由于lis1
始终保持不变,因此所有lis2
元素最终都指向同一对象。要解决此问题,您需要更改append()
行,以便每次复制列表:
lis2.append(lis1[:])
现在,要对结果进行排序,只需在循环后调用sort()
:
lis2.sort()
首先,您的代码反复将
lis1
引用插入lis2
。由于lis1
始终保持不变,因此所有lis2
元素最终都指向同一对象。要解决此问题,您需要更改append()
行,以便每次复制列表:
lis2.append(lis1[:])
现在,要对结果进行排序,只需在循环后调用sort()
:
lis2.sort()
您正在对同一列表进行6次洗牌和追加操作。请参阅可能的重复(请参阅答案,
*
语法不同,但结果/问题相同)您正在对同一列表进行6次洗牌和追加操作。请参阅可能的重复(请参阅答案,*
语法不同,但结果/问题相同)这只能产生一小部分排列。是的,我同意它会旋转列表,而不是洗牌。我在发帖时没有注意到这一点。谢谢你提到这只能产生一小部分排列。是的,我同意它会轮换列表而不是洗牌。我在发帖时没有注意到这一点。谢谢你的提醒