在Python OrderedDict中获取密钥索引?

Jas*_*n S 14 python dictionary ordereddictionary

我有一个collections.OrderedDict关键值对列表.我想计算索引i,使得ith键与给定值匹配.例如:

food = OrderedDict([('beans',33),('rice',44),('pineapple',55),('chicken',66)])
Run Code Online (Sandbox Code Playgroud)

我想从密钥chicken转到索引3,或从密钥rice转到索引1.我现在可以使用

food.keys().index('rice')
Run Code Online (Sandbox Code Playgroud)

有没有办法利用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}
Run Code Online (Sandbox Code Playgroud)

但我希望可能会有一些内置的东西OrderedDict.

Bre*_*arn 15

基本上没有.OrderedDict只需使用常规的,无序的dict,就可以通过键名快速查找内容.订单信息分别存储在双向链表中.因此,没有办法直接从密钥到索引.OrderedDict中的顺序主要用于迭代; 钥匙不"知道"自己的订单.


mar*_*eau 5

正如其他人指出的那样,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
Run Code Online (Sandbox Code Playgroud)

  • 您可以这样做,但如果您添加和/或删除项目,它不会保持同步。 (4认同)