我有一个collections.OrderedDict
,其中包含键值对的列表。我想计算索引i
,使i
键与给定值匹配。例如:
food = OrderedDict([('beans',33),('rice',44),('pineapple',55),('chicken',66)])
我想从密钥chicken
转到索引3,或从密钥rice
转到索引1.我现在可以使用
food.keys().index('rice')
但是有没有办法利用OrderedDict
通过密钥名称快速查找内容的能力?否则看起来索引查找将是O(N)而不是比O(log N),我有很多项目。
我想我可以通过创建自己的索引来手动执行此操作:
>>> foodIndex = {k:i for i,k in enumerate(food.keys())}
>>> foodIndex
{'chicken': 3, 'rice': 1, 'beans': 0, 'pineapple': 2}
但我希望OrderedDict
内置一些内容。
答案 0 :(得分:14)
基本上没有。 OrderedDict只需使用常规的,无序的dict,就可以通过键名快速查找内容。订单信息分别存储在双向链表中。因此,没有办法直接从密钥转到索引。 OrderedDict中的顺序主要用于迭代;一把钥匙没有"知道"它自己的订单。
答案 1 :(得分:4)
OrderedDict是dict
的子类,它能够按maintaining a doubly linked list按顺序(和颠倒顺序)遍历其键。所以它不知道密钥的索引。它只能遍历链表以在O(n)时间内找到项目。
Perusing the source code可能是最令人满意的方式来确认OrderedDict不维护索引。您将看到没有使用或获得的索引在哪里。
答案 2 :(得分:3)
正如其他人所指出的,OrderedDict只是一个字典,它在内部记住添加了哪些订单条目。但是,您可以通过将所需索引与每个条目的其余数据一起存储来利用其快速查找内容的功能。这就是我的意思:
from collections import OrderedDict
foods = [('beans', 33), ('rice', 44), ('pineapple', 55), ('chicken', 66)]
food = OrderedDict(((v[0], (v[1], i)) for i, v in enumerate(foods))) # saves i
print(food['rice'][1]) # --> 1
print(food['chicken'][1]) # --> 3