如何将键值元组列表转换成字典?


125

我有一个列表,看起来像:

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

我想把它变成一个像这样的字典:

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

最好的方法是什么?

编辑:我的元组列表实际上更像是:

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

1
AB(或BERA)和C(或CE)真正是什么样的实体?谢谢

我愿意打赌,以下工作示例产生的错误与他没有元组列表有关,而是他希望将其分成两个元组的列表非常长有关。
gddc 2011年

Answers:


90

这给了我与尝试拆分列表并压缩列表相同的错误。ValueError:字典更新序列元素#0的长度为1916;2个为必填项

那是你的实际问题。

答案是列表中的元素与您认为的不一样。如果键入,myList[0]您会发现列表的第一个元素不是二元组,例如('A', 1),而是1916长度的iterable。

一旦您真正有了原始问题(myList = [('A',1),('B',2),...])中所述表格的列表,您所需要做的就是dict(myList)


谢谢,我不知道列表是怎么得到的,但是从头开始修改之后,我得以修复它。
弗雷德·威尔逊

1
@DJ_Stuffy_K :(假定上下文与该问题无关)通常,除非多余或减慢程序速度,否则最好将dicts创建为对要隐式构建的任何抽象数据结构的有用索引。“良好实践”的概念完全取决于上下文。您是否需要O(1)查找密钥时间?同样,您不能任意“将列表转换为字典”;它完全取决于语义。例如[(1,2), (1,3)]-> {1:3}会破坏您的钥匙并丢失信息!字典是与O(1)插入/删除时间的一对一关系。列表是一个列表。
ninjagecko

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

5
还评论了另一个建议相同的答案:这不包括具有重复的元组“键”,例如:l=[('A',1), ('B',2), ('C',3), ('A', 2)]将导致具有'A': 1可能不是期望的结果。
吉瓦尔

32

你有尝试过吗?

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

ValueError:字典更新序列元素#0的长度为1916;2是必需的
Fred Wilson

那是从我的终端直接粘贴的消息,因此应该可以。您能确切显示出发生此错误的方法吗?
没用

@Fred,您一定输入了错误的内容,这个答案很好。
martineau 2011年

@FredWilson,这是您尝试类似操作时通常会遇到的错误dict([string1, string2, string3, string4])
chacham15 2014年

2
这不包括具有重复的元组“键”,例如:l=[('A',1), ('B',2), ('C',3), ('A', 2)]将导致具有'A': 1可能不是期望的结果。
吉瓦尔

10

这是处理重复的元组“键”的方法:

# 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]}

太棒了!帮助我。
unpairestgood,

太好了!,帮了很多忙
Athar

2

使用字典推导的另一种方式

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

2

如果Tuple没有重复键,则很简单。

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

如果元组具有键重复。

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.