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)
。