Lista de tuplas para dicionário

111

Veja como estou convertendo atualmente uma lista de tuplas em dicionário em Python:

l = [('a',1),('b',2)]
h = {}
[h.update({k:v}) for k,v in l]
> [None, None]
h
> {'a': 1, 'b': 2}

Existe uma maneira melhor? Parece que deveria haver uma linha para fazer isso.

Sarah Vessels
fonte

Respostas:

177

Basta chamar dict()a lista de tuplas diretamente

>>> my_list = [('a', 1), ('b', 2)]
>>> dict(my_list)
{'a': 1, 'b': 2}
Sven Marnach
fonte
1
Derp, eu sabia que haveria uma maneira simples de fazer isso ... Vindo do Ruby aqui, tentando aprender a maneira Python de fazer as coisas. Obrigado!
Sarah Vessels
5
@chandresh Isso faz o trabalho em Python 3, por isso não atualização é necessária.
Sven Marnach,
@SvenMarnach, Aqui está minha saída do mesmo comando que você escreveu acima no terminal py 3.5. Traceback (última chamada mais recente): Arquivo "<ipython-input-313-7bb3559567ff>", linha 1, em <module> dict (my_list) TypeError: O objeto 'Dicionário' não pode ser chamado
CKM
4
@chandresh Isso não tem nada a ver com Python 3 - é porque você tem uma variável chamada dict, obscurecendo o Python embutido com o mesmo nome. Você nunca deve fazer isso.
Sven Marnach
@SvenMarnach Oh. Obrigado. Funcionou. Na verdade, peguei algum código da web e tentei executá-lo. Parece que o autor usou o dictnome da variável de onde obtive o erro. Obrigado novamente.
CKM
23

O dictconstrutor aceita a entrada exatamente como você a tem (tuplas de chave / valor).

>>> l = [('a',1),('b',2)]
>>> d = dict(l)
>>> d
{'a': 1, 'b': 2}

Da documentação :

Por exemplo, todos eles retornam um dicionário igual a {"um": 1, "dois": 2}:

dict(one=1, two=2)
dict({'one': 1, 'two': 2})
dict(zip(('one', 'two'), (1, 2)))
dict([['two', 2], ['one', 1]])
FogleBird
fonte
15

Com dictcompreensão:

h = {k:v for k,v in l}
Kenly
fonte
4
bom porque permite que você
formate
7

Parece que todos aqui assumem que a lista de tuplas tem mapeamento um para um entre chave e valores (por exemplo, não tem chaves duplicadas para o dicionário). Como esta é a primeira pergunta que surge ao pesquisar neste tópico, postarei uma resposta para um caso mais geral em que temos que lidar com duplicatas:

mylist = [(a,1),(a,2),(b,3)]    
result = {}
for i in mylist:  
   result.setdefault(i[0],[]).append(i[1])
print(result)
>>> result = {a:[1,2], b:[3]}
pegah
fonte