Как поменять элементы в списке внутри списка Python - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь случайным образом поменять 2 элемента в каждом списке в списке, где те, которые должны быть заменены, не находятся в другом списке.

Вот мой код

import random    


def swap(mylist):
        remain = [[1, 2], [4], [], [8, 2], [1, 4], [5, 2, 1], [], [9, 5], [7]]
        for x in range(0, 9):
            remaining = set(mylist[x]) - set(remain[x])
            to_swap = random.sample(remaining, 2)
            mylist[x][mylist[x].index(to_swap[0])], mylist[x][mylist[x].index(to_swap[1])] = mylist[x][mylist[x].index(to_swap[1])], mylist[x][mylist[x].index(to_swap[0])]
        return mylist


print(swap([[8, 5, 4, 1, 3, 9, 7, 6, 2], [9, 3, 5, 6, 4, 7, 1, 2, 8], [7, 3, 2, 5, 4, 1, 9, 6, 8], [2, 1, 3, 8, 6, 9, 5, 7, 4], [1, 2, 3, 5, 7, 4, 9, 8, 6], [6, 9, 3, 1, 7, 4, 2, 8, 5], [1, 2, 7, 4, 3, 8, 5, 9, 6], [3, 7, 8, 4, 1, 5, 9, 6, 2], [4, 2, 6, 5, 7, 1, 9, 3, 8]]))

Всякий раз, когда язапустите это и распечатайте результат, он просто снова распечатывает мой ввод.

Кто-нибудь знает, что не так с моим кодом?

Спасибо.

1 Ответ

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

Ваш код выполняет своп с примерно половиной подсписков. Интересно, в чем причина этого поведения * (см. Ниже).

Если переписать заменяемую часть следующим образом:

    i = mylist[x].index(to_swap[0])
    j = mylist[x].index(to_swap[1])
    mylist[x][i], mylist[x][j] = mylist[x][j], mylist[x][i]

, тогда это сработает.

ОБНОВЛЕНИЕ:

Нет необходимости обращаться к спискам в правой части назначения, так как мы уже знаем значения, поэтому обновленный ответ будет:

    i = mylist[x].index(to_swap[0])
    j = mylist[x].index(to_swap[1])
    mylist[x][i], mylist[x][j] = to_swap[1], to_swap[0]

* ОБНОВЛЕНИЕ 2:

Вышеупомянутое поведение вызвано тем, что в нескольких присваиваниях выражения в левой части вычисляются как однопо одному слева направо.Это означает, что код OP не работал в случаях, когда index(to_swap[0]) < index(to_swap[1]).

Пример: значения 5 и 6 в первом подсписке [8, 5, 4, 1, 3, 9, 7, 6, 2].Сначала программа выполнит

mylist[x][mylist[x].index(5)] = 6

, изменив список на [8, 6, 4, 1, 3, 9, 7, 6, 2].Во-вторых, программа выполнит

mylist[x][mylist[x].index(6)] = 5

, изменив его обратно на [8, 5, 4, 1, 3, 9, 7, 6, 2].

...