【问题标题】:getting the key index in a Python OrderedDict?获取 Python OrderedDict 中的键索引?
【发布时间】:2015-02-27 20:17:37
【问题描述】:

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

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 中可能包含一些内容。

【问题讨论】:

  • food.keys().index('rice') 是否适用于 python3?

标签: python dictionary ordereddictionary


【解决方案1】:

基本上没有。 OrderedDict 只需在后台使用常规的无序字典即可通过键名快速查找内容。订单信息单独存储在一个双向链表中。正因为如此,没有办法直接从键到它的索引。 OrderedDict 中的顺序主要用于迭代;一个键不“知道”它自己的顺序。

【讨论】:

    【解决方案2】:

    正如其他人所指出的,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 的子类,它能够按maintaining a doubly linked list 的顺序(和相反的顺序)遍历其键。所以它不知道键的索引。它只能在 O(n) 时间内遍历链表找到项目。

    Perusing the source code 可能是确认索引不是由 OrderedDict 维护的最令人满意的方式。您会看到,没有任何地方使用过或获得过索引。

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2011-02-10
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多