Подтвердить что ты не робот

Как инициализировать словарь пустых списков в 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 работает не так, как ожидалось?

4b9b3361

Ответ 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']