#python #list #dictionary
#python #Список #словарь
Вопрос:
Я создал словарь с именем matrix, который имеет ключи от 0 до 3, а затем значения представляют собой список имен. Каждый ключ имеет одинаковые значения (список имен). Когда я присваиваю узлу имя, я хотел бы обновить словарь, чтобы удалить это имя только из одного ключа.Как показано в приведенном ниже коде, если я хочу обновить ключ 0, удалив значение «jason», оно также удаляет «jason» из всех других ключей. Мне все еще нужно, чтобы «jason» был значением для ключей с 1 по 3 после его удаления только из ключа 0.
node = [0,1,2,3]
names = ["jason", "martin", "ronnie", "mike"]
def table (node, names):
options = {}
for i in range(len(node)):
options [i] = names
return options
matrix = table(node,names)
print "Before removing Jason: " str(matrix)
alist = matrix[0]
alist.remove('jason')
matrix[0] = alist
print "After removing Jason: " str(matrix)
print matrix
Я также включил скриншот:
Ответ №1:
Все ключи в вашем словаре ссылаются на один и тот же список. Вы хотите назначить копию этого списка каждому ключу, чтобы копии можно было изменять независимо. Замените этот код:
for i in range(len(node)):
options [i] = names
с помощью
for i in range(len(node)):
options [i] = names[:]
Ответ №2:
Список является ссылкой в python, что означает:
>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True
>>> a[0] = 4
>>> b
[4, 2, 3]
Если вы хотите создать новый список, вам нужно сделать:
options [i] = list(names)
Ответ №3:
решение: вместо назначения names
assign names[:]
, поскольку вы назначали каждый раз одну и ту же ссылку.
names[:]
(поскольку names
это стандартный список) создаст копию names
, поскольку вы все нарезаете.
Ответ №4:
Что вы хотите сделать, это создать новый массив вместо изменения массива.
node = [0,1,2,3]
names = ["jason", "martin", "ronnie", "mike"]
def table (node, names):
options = {}
for i in range(len(node)):
options [i] = names
return options
matrix = table(node,names)
print "Before removing Jason: " str(matrix)
matrix[0] = [x for x in alist where x is not 'jason']
print "After removing Jason: " str(matrix)
print matrix