Python使用随机模块创建嵌套列表
假设我想要创建一个带有数字序列的嵌套列表,并且我不想要重复的列表序列 i、 e.我想这样:Python使用随机模块创建嵌套列表,python,list,python-3.x,random,nested-lists,Python,List,Python 3.x,Random,Nested Lists,假设我想要创建一个带有数字序列的嵌套列表,并且我不想要重复的列表序列 i、 e.我想这样:[[1,2,3,4],[2,1,3,4],[4,2,3,1],其中列表的len取决于我在有限的尝试中可以生成多少个不重复的数字序列(以下情况下为四次尝试) 这是我的第一次尝试: import random rng = random.Random() bd =list(range(4)) i = 0 result =[] while i <4: rng.shuffle(bd) if b
[[1,2,3,4],[2,1,3,4],[4,2,3,1]
,其中列表的len
取决于我在有限的尝试中可以生成多少个不重复的数字序列(以下情况下为四次尝试)
这是我的第一次尝试:
import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]
while i <4:
rng.shuffle(bd)
if bd not in result:
result.append(bd)
i +=1
print(result)
结果:[[3,2,0,1],[1,0,3,2],[0,1,3,2]]
我所做的只是在每个循环中重新设置列表bd
根据我的理解,列表bd
在每个循环中都会被洗牌,因此将bd
重置为[0,1,2,3]
应该没有意义。
有人能给我解释一下为什么修改后的代码可以工作吗?谢谢 在您的第一次尝试中,每次都会洗牌并将相同的列表附加到结果中。尝试使用副本,从整个列表中选取一部分:
bd[:]
是一个完全独立的对象,下次在循环中洗牌原始的bd
时不会更改
import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]
while i <4:
rng.shuffle(bd)
if bd not in result:
result.append(bd[:])
i +=1
print(result)
在您的第一次尝试中,每次都会洗牌并将相同的列表追加到结果中。尝试使用副本,从整个列表中选取一部分:
bd[:]
是一个完全独立的对象,下次在循环中洗牌原始的bd
时不会更改
import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]
while i <4:
rng.shuffle(bd)
if bd not in result:
result.append(bd[:])
i +=1
print(result)
Python中的列表和类似对象通过引用被引用。考虑下面的简单例子:
a_list = [1,2,3,4,5]
another_list = []
for i in range(5):
another_list.append(a_list)
a_list[0] = i + 10
print(another_list)
您希望输出为:
[[10, 2, 3, 4, 5], [11, 2, 3, 4, 5], [12, 2, 3, 4, 5], [13, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
但是,您看到的输出是:
[[14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
每次调用另一个列表。追加(列表),都会向列表
追加一个引用。然后更改列表,前面附加的引用指向已更改的列表
最后,a_列表
等于[14,2,3,4,5]
,而另一个_列表
包含对该列表的五个相同引用
回到你的案子上来。为了防止这种情况发生,您可以在每次附加列表时创建列表的副本:
随机导入
rng=random.random()
i=0
结果=[]
而Python中的i列表和类似对象是通过引用来引用的。考虑下面的简单例子:
a_list = [1,2,3,4,5]
another_list = []
for i in range(5):
another_list.append(a_list)
a_list[0] = i + 10
print(another_list)
您希望输出为:
[[10, 2, 3, 4, 5], [11, 2, 3, 4, 5], [12, 2, 3, 4, 5], [13, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
但是,您看到的输出是:
[[14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
每次调用另一个列表。追加(列表)
,都会向列表
追加一个引用。然后更改列表,前面附加的引用指向已更改的列表
最后,a_列表
等于[14,2,3,4,5]
,而另一个_列表
包含对该列表的五个相同引用
回到你的案子上来。为了防止这种情况发生,您可以在每次附加列表时创建列表的副本:
随机导入
rng=random.random()
i=0
结果=[]
虽然我发生这种情况是因为您将bd
附加到result
中,并且在下一次迭代中使用bd
,它们具有相同的引用。
在第二个迭代中,在每个迭代中生成一个新列表(不同的引用) 发生这种情况是因为您将bd
附加到result
中,并且在下一次迭代中使用bd
,它们具有相同的引用。
在第二个迭代中,在每个迭代中生成一个新列表(不同的引用) 您的代码有一个小问题:shuffle执行就地更改,因此它会更改变量引用的对象。通过运行第一个代码,您将始终得到一个结果——最后一个洗牌操作。为避免此情况,您应附加一份列表副本:
import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]
while i <4:
rng.shuffle(bd)
if bd not in result:
result.append(bd[:])
i +=1
print(result)
随机导入
rng=random.random()
bd=列表(范围(4))
i=0
结果=[]
虽然我您的代码有一个小问题:shuffle执行就地更改,因此它会更改变量引用的对象。通过运行第一个代码,您将始终得到一个结果——最后一个洗牌操作。为避免此情况,您应附加一份列表副本:
import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]
while i <4:
rng.shuffle(bd)
if bd not in result:
result.append(bd[:])
i +=1
print(result)
随机导入
rng=random.random()
bd=列表(范围(4))
i=0
结果=[]
而我也看到了感谢阿尔基马雷德斯。现在一切都有意义了,谢谢你。现在一切都有意义了。谢谢WoLy:)解决我问题的清晰答案谢谢WoLy:)解决我问题的清晰答案