获取 Python OrderedDict 中的键索引?

问题描述 投票:0回答:4

我有一个

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
中可能内置一些东西。

python dictionary ordereddictionary
4个回答
21
投票

基本上没有。 OrderedDict 只需使用底层的常规、无序字典即可通过键名称快速查找内容。订单信息单独存储在双向链表中。因此,无法直接从键转到其索引。 OrderedDict 中的顺序主要是为了可用于迭代;钥匙不“知道”自己的顺序。


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

3
投票

OrderedDict 是

dict
的子类,它能够通过维护双向链表按顺序(和逆序)遍历其键。所以它不知道键的索引。它只能在 O(n) 时间内遍历链表来查找项目。

仔细阅读源代码可能是确认索引不是由 OrderedDict 维护的最令人满意的方法。您会发现没有任何地方使用或获取过索引。


0
投票

对于未来查看这篇文章的人

可以利用按顺序访问键的事实来创建一个新列表,然后可以使用与原始帖子类似的语法来使用该列表。

food_keys = [item for item in food]
food_keys.index('rice')
© www.soinside.com 2019 - 2024. All rights reserved.