Minha tentativa de criar programaticamente um dicionário de listas não está me permitindo endereçar individualmente as chaves do dicionário. Sempre que crio o dicionário de listas e tento anexar a uma chave, todas elas são atualizadas. Aqui está um caso de teste muito simples:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Resultado atual: {0: ['hello'], 1: ['hello']}
Resultado esperado: {0: [], 1: ['hello']}
Aqui está o que funciona
data = {0:[],1:[]}
data[1].append('hello')
print data
Resultado real e esperado: {0: [], 1: ['hello']}
Por que o fromkeys
método não está funcionando conforme o esperado?
fonte
fromkeys()
método aceitasse uma função de fábrica, para que pudéssemos passarlist
como uma função e essa função seria chamada uma vez para cada chave criada, mas essa não é a API real dedict.fromkeys()
.Em vez disso, use defaultdict :
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
Dessa forma, você não precisa inicializar todas as chaves que deseja usar nas listas de antemão.
O que está acontecendo em seu exemplo é que você usa uma lista (mutável):
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
iria produzir
{0: [1, 2], 1: [1, 2]}
.fonte
list
aqui não é uma lista vazia, mas um tipo (ou você pode vê-lo como um construtor que pode ser chamado, eu acho). Portanto, toda vez que uma chave ausente é passada, uma nova lista é criada em vez de reutilizar a mesma.Você está preenchendo seus dicionários com referências a uma única lista, de modo que, ao atualizá-la, a atualização se reflete em todas as referências. Em vez disso, tente uma compreensão de dicionário. Veja Criar um dicionário com compreensão de lista em Python
d = {k : v for k in blah blah blah}
fonte
v
nesta resposta?Você pode usar isto:
data[:1] = ['hello']
fonte