你的错误:
为什么会出现ValueError: dictionary update sequence element #0 has length 1916; 2 is required
错误:
答案是你的列表元素不是你想象的那样。如果你输入myList[0]
,你会发现你的列表的第一个元素不是一个二元组,例如('A', 1)
,而是一个长度为1916的可迭代对象。
一旦你真正地拥有了你在原始问题中所述的形式的列表(myList = [('A',1),('B',2),...]
),你只需要执行dict(myList)
即可。
总体而言:
要么使用通常的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}
>>> dict( zip(range(2),range(2)) )
{0: 0, 1: 1, 2:2}
一个Python字典是一个无序的集合,其可以进行O(1)搜索,包含一系列键值对{(k
ey→v
alue), ...},其中键可以是任何不可变对象,值可以是任何对象。
为了在字典中使用键,键必须实现.__eq__()
和.__hash__()
方法。如果你正在考虑实现它,那么你可能正在做一些错误的事情,应该考虑使用其他映射数据结构!(尽管有时你可以通过将键包装在不同的包装器结构中并使用常规字典来解决问题,但这可能不是理想的)
希望实现“冻结”或“不可变”类型,或者伪装成这种类型的中级或高级程序员必须非常小心,否则您的程序将出现极其微妙且几乎不可能找到的错误:
如果您允许稍后更改对象的相等概念,以使其发生变化,则无法使用字典。被视为相等的对象必须始终返回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
。
A
、B
(或BERA
)和C
(或CE
)到底是什么实体?谢谢。 - eat