我正在编写一个简单的练习软件。
def check(num, lst):
for i in lst:
if num == i:
return False
else:
lst.append(num)
return True
timelst = []
for i1 in range(1,7):
usednum = [i1]
for i2 in range(1,7):
if not check(i2, usednum):
continue
for i3 in range(1,7):
if not check(i3, usednum):
continue
for i4 in range(1,7):
if not check(i4, usednum):
continue
for i5 in range(1,7):
if not check(i5, usednum):
continue
for i6 in range(1,7):
if not check(i6, usednum):
continue
else:
print(usednum) #print the appending list before actual appending
timelst.append(usednum)
usednum.pop()
break
usednum.pop()
运行此命令时,这就是我希望的时间:
[[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 6, 5],
[2, 1, 3, 4, 5, 6],
[2, 1, 3, 4, 6, 5],
...
]
但是,这实际上是我得到的:
[[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6],
[2, 1, 3, 4, 5, 6],
[2, 1, 3, 4, 5, 6],
...
]
我对此感到非常困惑,并被困了很长时间。我尝试在附加之前打印“ usednum”列表,它完美地返回了我想要的。
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 6, 5]
[2, 1, 3, 4, 5, 6]
[2, 1, 3, 4, 6, 5]
#printed lists while running the program
但是,每次执行程序后检查timelst时,仍然会出现相同的问题。
我将python 3.7与spyder一起使用。我的编译器应该没有问题,因为我尝试在ipython上运行它,但仍然得到相同的结果。
有人可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:0)
通过使用itertools.permutations()函数调用,您可以使生活更加轻松:
import itertools
mylist = [1, 2, 3, 4, 5, 6]
for item in itertools.permutations(mylist):
# Do something with item, which is a permutation of 'mylist'
print(item)
但是请注意,这会导致结果列表很大(6!
...是六阶因数)。如果您只想组合,请查看itertools.combinations()。
答案 1 :(得分:0)
问题已解决!我应该早些意识到,我附加的清单的浅层和深层副本存在问题。我添加了
usednum = copy.deepcopy(usednum)
到最后一个循环,所以现在看起来像
for i6 in range(1, 7):
if not check(i6, usednum):
continue
else:
timelst.append(usednum)
usednum = copy.deepcopy(usednum) #the new copy of the appended list, so now there's nothing to do with the appended one.
print('i6',usednum.pop())
break
usednum.pop()
现在可以正常工作