python - 为什么 dict_items 对象不支持索引?

标签 python dictionary

我知道您可以将 dict_items 转换为 list 以允许项目索引。但是不知道为什么直接不允许这个操作。是因为 dict_items 对象是生成器吗?如果是这样,当我看到

>>> {"foo": "bar", "baz": "qux"}.items()
dict_items([('foo', 'bar'), ('baz', 'qux')]) 

repr 被调用时,Python 是否评估我的生成器?

最佳答案

dict_items 不支持索引,因为这些对象旨在类似于集合,而集合不支持索引。

它们以其他方式像集合一样嘎嘎作响:

>>> d1 = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
>>> d2 = {'k2': 'v2', 'k3': 'not v3'}
>>> d1.items() & d2.items()
{('k2', 'v2')}
>>> d1.items() | d2.items()
{('k1', 'v1'), ('k2', 'v2'), ('k3', 'not v3'), ('k3', 'v3')}

如果任何值不可哈希,您将失去使用集合操作处理字典项 View 的能力。

dict_items View 提供索引支持是不明智的,因为字典在 Python 3.7+ 之前没有排序,因此访问“第 0 个”项目将无法明确定义。即使在 Python 3.7 中, 有一个用于索引的合理顺序(即插入顺序),实现它的复杂度也很复杂 O(1) ,所以不支持。 “不成文的规则”是索引应该是常量时间操作(就像列表、元组、字典、str - see here 一样)。

关于python - 为什么 dict_items 对象不支持索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52900328/

相关文章:

python - 为什么 `len(l) != 0` 在 CPython 中比 `bool(l)` 快?

python - 如何在 Pandas 中用滚动平均值填充南值

python - 将pybind11嵌入虚拟环境

带有数学符号的 Python 字典

python - 从 2 元组列表创建字典

python - 点击类型转换

python - 遍历xml元素的有效方法

java - 在单独的 JSTL 循环中访问 Map 值

javascript - 传单-React : L is not defined

python - 将多个 python 字典初始化为相同的键名和值