Моя попытка программно создать словарь списков не позволяет мне индивидуально адресовать ключи словаря. Когда я создаю словарь списков и пытаюсь добавить к одному ключу, все они обновляются. Вот очень простой тестовый пример:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Фактический результат: {0: ['hello'], 1: ['hello']}
Ожидаемый результат: {0: [], 1: ['hello']}
Вот что работает
data = {0:[],1:[]}
data[1].append('hello')
print data
Фактический и ожидаемый результат: {0: [], 1: ['hello']}
Почему fromkeys
метод работает не так, как ожидалось?
python
list
dictionary
Мартин Берч
источник
источник
fromkeys()
метод принял вместо этого фабричную функцию, чтобы мы могли передать ееlist
как функцию, и эта функция вызывалась бы один раз для каждого созданного ключа, но это не фактический APIdict.fromkeys()
.Использовать defaultdict этого :
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
Таким образом, вам не нужно заранее инициализировать все ключи, которые вы хотите использовать для списков.
В вашем примере происходит то, что вы используете один (изменяемый) список:
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
будет выводить
{0: [1, 2], 1: [1, 2]}
.источник
list
здесь не пустой список, а тип (или вы можете увидеть его как вызываемый конструктор, я думаю). Таким образом, каждый раз, когда передается отсутствующий ключ, создается новый список вместо того, чтобы повторно использовать тот же самый.Вы заполняете словари ссылками на один список, поэтому при его обновлении обновление отражается во всех ссылках. Вместо этого попробуйте словарное понимание. См. Раздел Создание словаря с пониманием списка в Python
d = {k : v for k in blah blah blah}
источник
v
в этом ответе?Вы можете использовать это:
data[:1] = ['hello']
источник