Python: обновление списка значений в словаре

#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