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
中可能内置一些东西。
基本上没有。 OrderedDict 只需使用底层的常规、无序字典即可通过键名称快速查找内容。订单信息单独存储在双向链表中。因此,无法直接从键转到其索引。 OrderedDict 中的顺序主要是为了可用于迭代;钥匙不“知道”自己的顺序。
正如其他人所指出的,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
对于未来查看这篇文章的人
可以利用按顺序访问键的事实来创建一个新列表,然后可以使用与原始帖子类似的语法来使用该列表。
food_keys = [item for item in food]
food_keys.index('rice')