【问题标题】:python OrderedDict get a key index ofpython OrderedDict 获取关键索引
【发布时间】:2018-09-13 12:51:00
【问题描述】:

OrderedDict能拿到关键位置吗?

类似于listindex()

test = ['a', 'b', 'c', 'd', 'e']
test.index('b') # return 1

【问题讨论】:

  • Python 3.6 dict 是有序的,应该能够以 O(1) 执行此操作
  • @DavidHeffernan,你能解释一下 O(1) 复杂度如何实现吗?以下所有答案都使用list.index(或next 与生成器表达式)。
  • @jpp 3.6 中引入的 compact dict 具有支持这一点的数据结构。但我无法在评论中解释该数据结构。你需要阅读它。
  • @DavidHeffernan,是的,我已经阅读了结构,但据我所知,O(1) 复杂性仅在 一次性 O (n) 构建映射字典的过程,如{v: k for k, v in enumerate(d)}。这个映射(据我所知)没有存储在 Python 中可访问的任何地方。
  • @jpp 如果您手头有 Python 字典,我认为这些信息不可用,但不清楚。我认为我的观点更多的是数据结构支持 O(1) index() 如果要实现的话。我可以看到我最初的评论甚至远没有表达出来! :-(

标签: python python-3.x list ordereddictionary


【解决方案1】:

每次您搜索职位时,接受的答案list(x).index('b') 将是O(N)

相反,您可以创建一个映射键 -> 位置,一旦构建映射,该位置将为 O(1)

ordered_dict = OrderedDict(a='', b='')

key_to_pos = {k: pos for pos, k in enumerate(ordered_dict)}
assert key_to_pos['b'] == 1

【讨论】:

    【解决方案2】:

    只有一行程序。 如:

    print(list(your_ordered_dict).index('your_key'))
    

    也许你可以使用lambda,像这样一行程序:

    f = lambda ordered_dict, key: list(ordered_dict).index(key)
    

    祝你好运。

    【讨论】:

      【解决方案3】:

      保持简单。

      from collections import OrderedDict
      
      x = OrderedDict('test1'='a', 'test2'='b')
      print(list(x.keys().index('test1'))
      

      【讨论】:

        【解决方案4】:

        你可以用两种方式写这个:

        • list(x).index('b')
        • next(i for i, k in enumerate(x) if k=='b')

        第一个对于小型字典来说会快一点,但对于大型字典来说会慢很多,并且浪费很多空间。 (当然大多数时候,OrderedDicts 都很小。)

        两个版本都适用于 any 可迭代; OrderedDict 这里没有什么特别之处。

        【讨论】:

          【解决方案5】:

          如果你把键作为一个列表,你可以像这样索引:

          代码:

          list(x).index('b')
          

          测试代码:

          from collections import OrderedDict
          
          x = OrderedDict(a=1, b=2)
          print(list(x).index('b'))
          

          结果:

          1
          

          【讨论】:

            猜你喜欢
            • 2015-02-27
            • 1970-01-01
            • 1970-01-01
            • 2020-09-19
            • 2017-02-23
            • 1970-01-01
            • 2018-01-19
            • 2018-09-20
            • 1970-01-01
            相关资源
            最近更新 更多