Что-то не так при добавлении списка в список в Python - PullRequest
0 голосов
/ 20 ноября 2018

Я программирую простое программное обеспечение для практики.

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

Но та же проблема все еще возникает каждый раз, когда я проверяю время после выполнения программы.

Я использовал python 3.7 со spyder. Не должно быть проблем с моим компилятором, так как я попытался запустить его на ipython, и все равно получил тот же результат.

Может кто-нибудь помочь мне решить эту проблему? Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Проблема была решена!Я должен был понять раньше, что возникла проблема с мелкой и глубокой копией списка, который я добавил.Я добавил

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

, который теперь может работать правильно

0 голосов
/ 20 ноября 2018

Вы можете сделать свою жизнь намного проще, используя функцию 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)

Обратите внимание, что это приводит к большому (* 1006)* ... это шестифакторный) список результатов.Если вам нужны только комбинации, взгляните на itertools.combination () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...