如何将键值元组列表转换为字典?
- 2025-03-05 09:16:00
- admin 原创
- 81
问题描述:
我有一个如下列表:
[('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
解决方案 1:
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}
解决方案 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 字典是O(1) 可搜索的无序对集合 {( k
ey→ v
alue), ...},其中键是任何不可变对象,值是任何对象。
键必须实现.__eq__()
和.__hash__()
方法才能在字典中使用。如果您正在考虑实现这一点,那么您可能做错了什么,也许应该考虑使用不同的映射数据结构!(虽然有时您可以将键包装在不同的包装器结构中并使用常规字典,但这可能并不理想。)
中级或高级程序员如果想要实现“冻结”或“不可变”类型,或者伪装成这种类型,必须非常小心,否则你的程序就会出现极其微妙和几乎不可能发现的错误:
如果您允许自己稍后改变对象,从而导致其相等性概念发生改变,则不能使用字典。被视为相等的对象必须始终__eq__
返回 True 并__hash__
返回相同的值。
这些方法必须严格遵守规范。这意味着:
对于新手:哈希函数(wikip.)可让您获得假阳性或真阳性结果;
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}
)。它还有一些dict
结构的变体。如果您想获取从“冻结字典”到值的映射,frozendict 不存在,除非作为第三方库,但您可以将字典提取.items()
为无序frozenset
的tuple
s。
解决方案 3:
你尝试过这个吗?
>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}
解决方案 4:
以下是处理重复元组“键”的一种方法:
# 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]}
解决方案 5:
如果 Tuple 没有键重复,则它很简单。
tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
如果元组有键重复。
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)
解决方案 6:
另一种方法是使用字典推导,
>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}
解决方案 7:
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
扫码咨询,免费领取项目管理大礼包!