Поменяйте местами два списка, хранящихся в кортеже - PullRequest
1 голос
/ 02 февраля 2020

У меня есть кортеж, который включает несколько списков, и мне нужно динамически поменять значения элементов в двух списках. Например, tuple_of_lists = (**list1**:[1,1,1],list2:[2,2,2],**list3**:[3,3,3]) Мне нужно иметь возможность вводить --swap x & y (1,3)-- и без изменения имен списков иметь вывод (**list1**:[3,3,3],list2:[2,2,2],**list3**:[1,1,1])

, все еще очень новый для python (и кодирование в общем) и думаю, что я что-то упускаю из структуры данных.

Я пытаюсь использовать что-то вроде:

intermediary = tuple_of_lists[1] 
tuple_of_lists[1] = list(tuple_of_lists[3]) 
tuple_of_lists[3] = list(intermediary)

, но получаю ошибку, что кортеж не принимает назначение - даже если это только список, который на самом деле изменяется? Есть ли простой способ решить?

Ответы [ 2 ]

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

Кортежи неизменны, поэтому вы не можете изменить их элемент. Списки, однако, являются изменяемыми.

Что вы можете сделать, это создать список из вашего кортежа, поменять местами элементы и преобразовать список обратно в кортеж:

tuple_of_lists = ([1,1,1], [2,2,2], [3,3,3])
lt =  list(tuple_of_lists)                    #create list from tuple
lt[2],lt[0] = lt[0],lt[2]                     #swap items 0 and 2
tuple_of_lists = tuple(lt)                    #convert to tuple

print(tuple_of_lists)

Вывод:

([3,3,3], [2,2,2], [1,1,1])
0 голосов
/ 02 февраля 2020

Почему вы получаете TypeError: 'tuple' object does not support item assignment?

Кортежи неизменны в python. Это означает, что после создания / инициализации вы не можете изменять их содержимое. Таким образом, кортежи не могут находиться слева от оператора присваивания и, следовательно, ошибки.

Решение:

Возможное решение состоит в том, чтобы изменить списки на месте вместо изменения ссылки на список хранится в кортеже. Рассмотрим этот пример кода,

a_tuple = ([1,1,1],[2,2,2],[3,3,3])
x = 1
y = 3
# We'll use x-1 and y-1 for 0-based indexing
temp = a_tuple[x-1].copy() # Keep a copy in temporary variable
a_tuple[x-1].clear() # Empty first list
a_tuple[x-1].extend(a_tuple[y-1]) # Fill it with second list
a_tuple[y-1].clear() # Empty second list
a_tuple[y-1].extend(temp) # Fill it with first list

print(a_tuple)

Выход

([3, 3, 3], [2, 2, 2], [1, 1, 1])
...