Невозможно поменять несколько элементов в списке в python - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в python и пытаюсь создать функцию, которая меняет несколько значений в списке одновременно.

def swap(deck: List[int], start1: int, end1: int, start2: int, end2: int) -> None: 

    start1 = start1 % len(deck)
    start2 = start2 % len(deck)


    end1 = end1 % len(deck)
    end2 = end2 % len(deck)

    if start1 < start2:
        deck[start1: end1], deck[start2: end2] = deck[start2: end2], deck[start1: end1]
    else:
        deck[start2: end2], deck[start1: end1] = deck[start1: end1], deck[start2: end2]

, когда deck = [0,1,2,3,4,5,6,7,8,9,10] swap(deck, -3, 11, 0, 2) должен изменить колоду на [8,9,2,3,4,5,6,7,0,1,10], но вместо этого я получаю [2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 10]

Я также пробовал это с помощью метода переменной temp

    temp = deck[start1: start1]

    deck[start1: start1] = deck[start2: end2]

    deck[start2: end2] = temp

но я получаю тот же результат ... Объяснение того, почему это происходит и как я могу это исправить, очень ценится.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

По сути, вы хотите:

deck = deck[s2:e2] + deck[e1:s2] + deck[s1:e1]

Не пытайтесь использовать две переменные до и после знака равенства =.

0 голосов
/ 17 февраля 2020

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

, например:

deck = [0,1,2,3,4,5,6,7,8,9,10]
temp = deck[0:2]         # temp is [0,1]  
deck[0:2] = deck[-3:11]  # deck is now [8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10]
deck[-3:11] = temp       # [8,9] is replaced by [0,1] 
                         # because -3 is now at position 9 instead of  8

Один из способов исправить это (при условии, что ваши диапазоны никогда не перекрываются) состоит в том, чтобы сформировать конкатенацию из 5 срезов колоды: [до диапазона1] + [диапазон2] + [между диапазонами] + [диапазон1] + [после диапазона 2], или, более конкретно, назначить общий поддиапазон путем объединения трех средних частей

deck[start1:end2] = deck[start2:end2] + deck[end1:start2] + deck[start1:end1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...