Eu tenho um dicionário vazio. Nome: dict_x
é para ter chaves cujos valores são listas.
A partir de uma iteração separada, obtenho uma chave (ex:) key_123
e um item (uma tupla) para colocar na lista do dict_x
valor de key_123
.
Se essa chave já existir, desejo anexar este item. Se essa chave não existir, desejo criá-la com uma lista vazia e anexá-la ou apenas criá-la com uma tupla.
No futuro, quando essa chave surgir novamente, já que ela existe, quero que o valor seja acrescentado novamente.
Meu código consiste nisso:
Obter chave e valor.
Veja se a chave NOT existe
dict_x
.e se não o criar:
dict_x[key] == []
Mais tarde:
dict_x[key].append(value)
É assim que se faz? Devo tentar usar try/except
blocos?
dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]
mas essa resposta sugere uma maneira muito melhor. Na verdade ele ficaset()
como um argumento e permite que você useadd()
método ...Aqui estão as várias maneiras de fazer isso, para que você possa comparar a aparência e escolher o que mais gosta. Ordenei-os de uma maneira que considero mais "pitônica" e comentei os prós e contras que podem não ser óbvios à primeira vista:
Usando
collections.defaultdict
:Prós: Provavelmente, melhor desempenho. Contras: Não disponível no Python 2.4.x.
Usando
dict().setdefault()
:Contras: criação ineficiente de
list()
s não utilizados .Usando
try ... except
:Ou:
fonte
.setdefault()
cria dicionários desnecessários. Eu acho que estou criandolist
s desnecessários (ie[]
) no segundo argumento de.setdefault()
que nunca é usado sekey
já existe. Eu poderia usardict.setdefault()
(para o benefício de um hash de chave eficiente) e usar uma variável para reutilizarlist
s não utilizados, mas isso adiciona mais algumas linhas de código..setdefault
cria um regulardict
onde chave ausente look-up irá resultar em umKeyError
enquantocollections.defaultdict(list)
cria umadict
onde pesquisas de chave ausentes irá inserir um vaziolist
- eu acho que você deve escolher com base no qual o comportamento que você querVocê pode usar um padrão para isso.
Isso é um pouco mais eficiente do que
setdefault
desde que você não cria novas listas que não usa. Cada chamada parasetdefault
criará uma nova lista, mesmo que o item já exista no dicionário.fonte
Você pode usar o defaultdict em
collections
.Um exemplo do doc:
fonte
fonte
dict.get
).