如何将键值元组列表转换为字典?
我有一个看起来像这样的列表:
[('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 个回答
你试过这个吗?
>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}
这段代码是用来处理一些特定的任务的。它可能涉及到一些数据的输入、输出或者是计算。具体来说,代码块中的内容会告诉计算机该怎么做,像是给它下达指令。
如果你看到一些像是变量、函数或者循环的东西,别担心,这些都是编程中常见的概念。变量就像是一个可以存放信息的盒子,函数则是一个可以重复使用的代码块,而循环则是让某些操作重复进行的工具。
总之,这段代码的目的是为了让计算机完成一些工作,而具体的内容和逻辑则需要根据代码块里的指令来理解。
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'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}
一个 Python 字典 是一个可以快速查找的无序键值对集合 {(k
ey→v
alue), ...},其中键可以是任何不可变对象,值可以是任何对象。
键必须实现 .__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 有一些内置的冻结数据结构,比如 namedtuple
、frozenset
等,但有时使用起来比较复杂。tuple
是基本的冻结版本,类似于基本的 list
结构(这让你可以存储 {(1, 2): 3, (4, 5): 6}
)。它还有一些字典结构的变体。如果你想从“冻结字典”映射到值,frozendict 只存在于第三方库中,但你可以将字典的 .items()
提取为一个无序的 frozenset
的 tuple
。