【问题标题】:Get value indices from dictionary从字典中获取值索引
【发布时间】:2016-08-31 01:40:37
【问题描述】:

我有一个OrderedDict

from collections import OrderedDict
d = OrderedDict([('r', 1), ('s', 5), ('a', 3), ('n', 7), ('y', 2)])

我想根据值范围获取字典值的索引。例如,字典d 的索引应该是数组(或np.array),如下所示:

indices
array([ 0, 3, 2, 4, 1 ], dtype=int64) 

索引4是字典中的最大值,索引0是最小值

我试过了:

indices = np.argsort(d.values)

【问题讨论】:

    标签: python python-2.7 dictionary indices


    【解决方案1】:

    您可以使用列表推导来实现:

    >>> values = d.values()
    >>> sorted_values = sorted(values)
    >>> [sorted_values.index(item) for item in values]
    [0, 3, 2, 4, 1]
    

    【讨论】:

    • 不幸的是这是O(n^2),所以我发布了一个(理论上)更有效的解决方案。
    【解决方案2】:

    既然您已经尝试过使用 argsort:

    np.argsort(d.values()).argsort()
    Out[50]: array([0, 3, 2, 4, 1], dtype=int64)
    

    所以 argsort 实际上并没有返回它们的顺序,而是返回了对该数组进行排序的索引。对该结果调用 argsort 可以满足您的要求。

    【讨论】:

      【解决方案3】:

      另一个答案很好也很简单,但是是O(n^2),因为每个.index 都是O(n)。您可以预先计算字典中的索引,以便索引查找为O(1),从而使整个事情成为O(nlogn),因为排序是最昂贵的部分。如果d 足够大,这将是一个非常重要的区别。

      >>> from itertools import izip
      >>> indices = dict(izip(sorted_values, xrange(len(d))))
      >>> indices
      {1: 0, 2: 1, 3: 2, 5: 3, 7: 4}
      >>> [indices[v] for v in d.itervalues()]
      [0, 3, 2, 4, 1]
      

      这里我使用xrange 代替rangeizip 代替zip,以及itervalues 代替values 以提高内存效率。

      【讨论】:

        【解决方案4】:

        最后我忘了在 values 后面加上(),所以我用了indices = np.argsort(d.values())

        【讨论】:

        • 是的,但仅 np.argsort 不会返回您想要的结果。它返回array([0, 4, 2, 1, 3], dtype=int64)
        猜你喜欢
        • 2019-01-29
        • 2019-09-21
        • 2021-05-25
        • 2018-11-13
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 2012-06-09
        • 2018-12-10
        相关资源
        最近更新 更多