Como converter lista de tuplas de valor-chave em dicionário?


125

Eu tenho uma lista que se parece com:

[('A', 1), ('B', 2), ('C', 3)]

Quero transformá-lo em um dicionário que se parece com:

{'A': 1, 'B': 2, 'C': 3}

Qual é a melhor maneira de fazer isso?

Edição: minha lista de tuplas é realmente mais como:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
Que tipo de entidades aqueles A, B(ou BERA) e C(ou CE) são realmente? Obrigado
comer

Estou disposto a apostar que os erros produzidos com os exemplos de trabalho abaixo estão relacionados a ele não ter uma lista de tuplas, mas uma lista extremamente longa que ele deseja separar em duas tuplas.
Gddc

Respostas:


90

Isso me dá o mesmo erro que tentar dividir a lista e compactá-la. ValueError: o elemento de sequência de atualização de dicionário # 0 tem comprimento 1916; 2 é obrigatório

Essa é a sua pergunta real .

A resposta é que os elementos da sua lista não são o que você pensa que são. Se você digitar myList[0], descobrirá que o primeiro elemento da sua lista não é uma tupla dupla, por exemplo ('A', 1), mas sim uma iterável de 1916.

Depois de realmente ter uma lista no formulário que você declarou em sua pergunta original ( myList = [('A',1),('B',2),...]), tudo que você precisa fazer é dict(myList).


Obrigado, não sei como a lista ficou assim, mas, depois de reformulá-la do zero, consegui corrigi-la.
11557 Fred São

1
@DJ_Stuffy_K: (supondo que o contexto não esteja relacionado a essa pergunta) Em geral, a menos que seja supérfluo ou retarde seu programa, é perfeitamente bom criar dicts como índices úteis em qualquer estrutura de dados abstrata que você esteja criando implicitamente. A noção de "boas práticas" é totalmente dependente do contexto; você precisa de tempo de pesquisa O (1) para chaves? Além disso, você não pode "converter listas em dicionários" arbitrariamente; depende inteiramente da semântica. por exemplo [(1,2), (1,3)]-> {1:3}iria bater suas chaves e perder informações! Um ditado é uma relação um-para-* com O (1) tempo de inserção / exclusão. Lista é uma lista.
Ninjagecko 20/0318

162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
Também comentou outra resposta que sugere o mesmo: Isso não cobre ter 'chaves' de tupla duplicadas, por exemplo: l=[('A',1), ('B',2), ('C',3), ('A', 2)]resultará em uma 'A': 1que pode não ser o resultado desejado.
guival

32

Você já tentou isso?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: o elemento de sequência de atualização de dicionário # 0 tem comprimento 1916; É necessário 2
Fred Wilson

Essa foi uma pasta reta do meu terminal, então deve funcionar. Você pode mostrar exatamente o que fez para obter esse erro?
Inútil

@ Fred, você deve ter digitado algo errado, esta resposta está bem.
martineau

@FredWilson que é o erro que você geralmente começa quando você tentar algo comodict([string1, string2, string3, string4])
chacham15

2
Isso não cobre ter 'chaves' de tupla duplicadas, por exemplo: l=[('A',1), ('B',2), ('C',3), ('A', 2)]resultará em um 'A': 1que pode não ser o resultado desejado.
guival

10

Aqui está uma maneira de lidar com "chaves" de tupla duplicadas:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

Impressionante! Me ajudou a sair.
precisa saber é

Ótimo !, ajudou muito
Athar

2

Outra maneira de usar a compreensão de dicionário,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}

2

Se a Tupla não tiver repetições de teclas, é Simples.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Se a tupla tiver repetições de teclas.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.