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

142 投票
7 回答
144203 浏览
提问于 2025-04-16 20:52

我有一个看起来像这样的列表:

[('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

7 个回答

34

你试过这个吗?

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

这段代码是用来处理一些特定的任务的。它可能涉及到一些数据的输入、输出或者是计算。具体来说,代码块中的内容会告诉计算机该怎么做,像是给它下达指令。

如果你看到一些像是变量、函数或者循环的东西,别担心,这些都是编程中常见的概念。变量就像是一个可以存放信息的盒子,函数则是一个可以重复使用的代码块,而循环则是让某些操作重复进行的工具。

总之,这段代码的目的是为了让计算机完成一些工作,而具体的内容和逻辑则需要根据代码块里的指令来理解。

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

你的错误:

为什么会出现 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}

一个 Python 字典 是一个可以快速查找的无序键值对集合 {(key→value), ...},其中键可以是任何不可变对象,值可以是任何对象。

键必须实现 .__eq__().__hash__() 方法,才能在字典中使用。如果你考虑自己实现这些方法,可能说明你在做的事情有问题,应该考虑使用其他的数据结构!(虽然有时你可以通过将键包装在其他结构中来使用普通字典,但这可能不是最佳选择。)

中级或高级程序员如果想实现一种“冻结”或“不可变”的类型,或者一种伪装成这种类型的对象,必须非常小心,否则你的程序可能会出现极其微妙且几乎无法找到的错误

如果你允许在后续修改对象,使得它的相等性可能发生变化,那么你就不能使用字典。被认为相等的对象必须始终使 __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})。它还有一些字典结构的变体。如果你想从“冻结字典”映射到值,frozendict 只存在于第三方库中,但你可以将字典的 .items() 提取为一个无序的 frozensettuple

撰写回答