É verdade, embora isso se funda em um dicionário de listas.
Katriel de
1
é uma lista e não um dict: >>> type ([{'a': 1}, {'b': 2}]) <type 'list'>
killown
Realmente deveria haver um forro para isso, considerando quantas vezes ele aparece. Existe uma razão pela qual {** d for d in d_list} não é compatível?
markemus de
Respostas:
163
Isso funciona para dicionários de qualquer tamanho:
>>> result ={}>>>for d in L:... result.update(d)...>>> result
{'a':1,'c':1,'b':2,'d':2}
Isso é assimétrico porque você precisa escolher o que fazer com as chaves duplicadas; neste caso, dict2substituirádict1 . Troque-os pelo outro caminho.
Uma pequena melhoria na resposta @dietbuddha com a descompactação do dicionário do PEP 448 , para mim fica mais legível dessa forma, também, é mais rápido também :
from functools import reduce
result_dict = reduce(lambda a, b:{**a,**b}, list_of_dicts)
Mas tenha em mente que isso funciona apenas com as versões Python 3.5+.
>>> dictlist =[{'a':1},{'b':2},{'c':1},{'d':2,'e':3}]>>> dict(kv for d in dictlist for kv in d.iteritems()){'a':1,'c':1,'b':2,'e':3,'d':2}>>>
Observação Eu adicionei um segundo par de chave / valor ao último dicionário para mostrar que ele funciona com várias entradas. Além disso, as chaves de dicts posteriores na lista sobrescreverão a mesma chave de um dict anterior.
Respostas:
Isso funciona para dicionários de qualquer tamanho:
Como uma compreensão :
fonte
No caso do Python 3.3+, há uma
ChainMap
coleção :Veja também:
fonte
Nota: a ordem de 'b' e 'c' não corresponde à sua saída porque os dictos não estão ordenados
se os dicts podem ter mais de uma chave / valor
fonte
Para dicionários planos, você pode fazer isso:
fonte
É semelhante a @delnan, mas oferece a opção de modificar os itens k / v (chave / valor) e acredito que seja mais legível:
por exemplo, substitua k / v elems da seguinte forma:
descompacta a tupla k, v do gerador de dicionário .items () depois de retirar o objeto dict da lista
fonte
Isso é assimétrico porque você precisa escolher o que fazer com as chaves duplicadas; neste caso,
dict2
substituirádict1
. Troque-os pelo outro caminho.EDIT: Ah, desculpe, não vi isso.
É possível fazer isso em uma única expressão:
Nenhum crédito para mim por isso!
No entanto, eu diria que pode ser mais pitônico (explícito> implícito, plano> aninhado) fazer isso com um
for
loop simples . YMMV.fonte
Você pode usar juntar a função de funcy biblioteca:
fonte
Uma pequena melhoria na resposta @dietbuddha com a descompactação do dicionário do PEP 448 , para mim fica mais legível dessa forma, também, é mais rápido também :
Mas tenha em mente que isso funciona apenas com as versões Python 3.5+.
fonte
Observação Eu adicionei um segundo par de chave / valor ao último dicionário para mostrar que ele funciona com várias entradas. Além disso, as chaves de dicts posteriores na lista sobrescreverão a mesma chave de um dict anterior.
fonte
dic1 = {'Maria': 12, 'Paco': 22, 'José': 23} dic2 = {'Patrícia': 25, 'Marcos': 22 'Tomas': 36}
dic2 = dict (dic1.items () + dic2.items ())
e este será o resultado:
dic2 {'Jose': 23, 'Marcos': 22, 'Patricia': 25, 'Tomas': 36, 'Paco': 22, 'Maria': 12}
fonte