Как инициализировать словарь пустых списков в Python?
Моя попытка программного создания словаря списков не позволяет мне индивидуально обращаться к словарным клавишам. Всякий раз, когда я создаю словарь списков и пытаюсь добавить один ключ, все они обновляются. Здесь очень простой тестовый пример:
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
работает не так, как ожидалось?
Ответы
Ответ 1
Передача []
в качестве второго аргумента в dict.fromkeys()
дает довольно бесполезный результат - все значения в словаре будут тем же самым объектом списка.
В Python 2.7 или выше вы можете вместо этого использовать dicitonary comprehension:
data = {k: [] for k in range(2)}
В более ранних версиях Python вы можете использовать
data = dict((k, []) for k in range(2))
Ответ 2
Используйте 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]}
.
Ответ 3
Вы заполняете словари ссылками на один список, поэтому при его обновлении обновление отражается во всех ссылках. Вместо этого попробуйте использовать словарь. Видеть
Создайте словарь со списком в Python
d = {k : v for k in blah blah blah}
Ответ 4
Вы можете использовать это:
data[:1] = ['hello']