Python 从字典中获取值索引

Python 从字典中获取值索引,python,python-2.7,dictionary,indices,Python,Python 2.7,Dictionary,Indices,我有一个订购的ICT: 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 = n

我有一个
订购的ICT

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)

您可以使用列表理解来实现这一点:

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

您可以使用列表理解来实现这一点:

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

另一个答案很简单,但是是
O(n^2)
,因为每个
索引都是
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
代替
range
izip
代替
zip
itervalues
代替
values
来提高内存效率。

另一个答案很简单,但每个
都是
O(n^2)
。索引
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
而不是
range
izip
而不是
zip
,以及
itervalues
而不是
值来提高内存效率。

自从您尝试使用argsort之后:

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

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

因为您已经尝试使用argsort:

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

因此,argsort实际上并不返回它们的顺序,而是返回将对该数组进行排序的索引。对该结果调用argsort就可以了。

最后我忘了在值之后放
()
,所以我使用了
索引=np.argsort(d.values())
最后我忘了在值之后放
()
,所以我使用了
索引=np.argsort(d.values())
不幸的是这是
O(n^2)
,所以我发布了一个(理论上)更有效的解决方案。不幸的是,这是
O(n^2)
,所以我发布了一个(理论上)更有效的解决方案。是的,但仅np.argsort不会返回您想要的结果。它返回
数组([0,4,2,1,3],dtype=int64)
。是,但仅np.argsort不会返回所需的结果。它返回
数组([0,4,2,1,3],dtype=int64)