我知道您可以将dict_items
转换为list
以允许项目索引。但是我不知道为什么不能直接进行此操作。是因为dict_items
对象是生成器吗?如果是这样,当我看到
>>> {"foo": "bar", "baz": "qux"}.items()
dict_items([('foo', 'bar'), ('baz', 'qux')])
在调用repr
时,Python是否正在评估我的生成器?
答案 0 :(得分:10)
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')}
如果任何值不可散列,则将失去使用set操作处理字典项视图的能力。
为dict_items
视图提供索引支持是不明智的,因为dict在Python 3.7+之前没有排序,因此无法很好地定义“第0”项的访问。即使在Python 3.7中,存在 用于索引的合理顺序(即插入顺序),以 O(1)复杂度实现它也是很重要的,因此不受支持。 “不成文的规则”是,索引应该是固定时间的操作(因为它适用于list,tuple,dict,str-see here)。