在python中将列表附加到列表时会出错

2024-10-02 06:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的练习软件。你知道吗

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()

在运行时,这就是我想要的Timelist:

[[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

但是每次我在执行程序后检查timelist时仍然会出现同样的问题。你知道吗

我在spyder中使用了Python3.7。我的编译器应该没有问题,因为我在ipython上试过运行这个程序,但仍然得到了相同的结果。你知道吗

有人能帮我解决这个问题吗?谢谢!你知道吗


Tags: inforreturnifchecknotrangeelse
2条回答

通过使用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()。你知道吗

问题解决了!我早该意识到,我所附清单的浅薄和深浅都有问题。我有补充

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()

现在可以正常工作了

相关问题 更多 >

    热门问题