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

我有一个清单,看起来像:

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

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

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

最好的办法是什么?

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

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

我得到的错误 ValueError: dictionary update sequence element #0 has length 1916; 2 is required

143009 次浏览
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

你试过这个吗?

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

你的错误:

为什么会出现 ValueError: dictionary update sequence element #0 has length 1916; 2 is required错误:

答案是,列表中的元素并不是你想象的那样。如果你输入 myList[0],你会发现列表的第一个元素不是两个元组,例如 ('A', 1),而是一个1916长度的迭代。

一旦你的 事实上有一个表格,你在你的原始问题(myList = [('A',1),('B',2),...]) ,所有你需要做的是 dict(myList)


[2021年编辑: 现在也回答实际问题,而不是关于具体错误的预期问题: ]

一般来说:

要么使用通常的 dict(iterableOrMapping) 构造函数,要么使用 词汇理解 {someExpr(k,v) for k:v in iterable}语法:

>>> example1 = [('A',1), ('B',2), ('C',3)]
>>> dict(example1)
{'A': 1, 'B': 2, 'C': 3}
>>> {x:x**2 for x in range(3)}
{0: 0, 1: 1, 2:4}
# inline; same as example 1 effectively. may be an iterable, such as
# a sequence, evaluated generator, generator expression


>>> dict( zip(range(2),range(2)) )
{0: 0, 1: 1, 2:2}

巨蟒字典是一个可搜索的无序对集合{(key → vvalue) ,... } ,其中键是任何不可变对象,值是任何对象。

键必须实现 < a href = “ https://docs.python.org/3/reference/datamodel.html # object._ _ eq _ _”rel = “ nofollow noReferrer”> .__eq__().__hash__()方法在字典中使用。如果您正在考虑实现这一点,您可能正在做一些错误的事情,也许应该考虑一个不同的映射数据结构!(虽然有时你可以用不同的包装结构包装钥匙,并使用常规的 dict,但这可能并不理想。)

中级或高级程序员如果希望实现一个“冻结”或“不可变”类型,或者一个伪装成一个类型的类型,必须非常小心,否则你的程序在使用 非常微妙,几乎不可能找到的漏洞时会出错:

如果您允许自己稍后对对象进行变异,使其相等的概念可能发生变化,则不能使用 dict。被认为相等的对象必须始终有 __eq__返回 True,并有 __hash__返回相同的值。

这些方法必须严格遵守规范,这意味着:

  • 对于新手: 哈希函数(维基。)让你得到一个假阳性或真阳性的结果; hash(x)==hash(y)意味着 x可能等于 y,然后内部 Python 代码必须检查 x==y(.__eq__)来确认它是真阳性而不是假阳性。这允许 O (1)查找。
  • 对于新手: 一旦对象处于最终状态,__hash__值不会因任何原因而改变,这一点至关重要。如果您不能同时保证这一点和 hash(x)!=hash(y) implies x!=y,您不应该使用阻塞。
  • 我们可以考虑 不同类型的映射,而不是修改数据本身。这可以等效于编写一个包装器对象,代价是使用一个库。这通常是没有必要的。
  • 对于专家来说: 还应该注意的是,一些默认对象的散列是加盐的,可能会在 Python 调用和版本之间发生变化(如果你存储或网络通信数据的任何方式包含 Python 散列,这可能是一个陷阱; 它们是一个内部细节,应该在每个进程启动时重新生成)。

Python 有很多内置的冻结数据结构,比如 namedtuplefrozenset等等,但是它们有时候很难处理。tuple是基本 list结构的基本冷冻变体(它可以让你存储一个 {(1, 2): 3, (4, 5): 6})。它还具有 dict结构的一些变体。如果你想得到一个从“冻结字典”到值的映射,除了作为第三方库,Frozendect 不存在,但是你可以提取字典的 .items()作为一个无序的 tuplefrozenset

这里有一种处理重复元组“键”的方法:

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

另一种使用字典理解的方法,

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

如果 Tuple 没有关键重复,那么它就是 Simple。

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

如果 tuple 具有键重复。

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

或者:

from collections import defaultdict
tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = defaultdict(list)
for i, j in tup:
dic[i].append(j)