按值然后按键对字典排序

时间:2019-05-08 15:32:44

标签: python sorting

我有一本这样的字典:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-cb3db1328026> in <module>()
----> 1 a, b, c = gen_data(n, p, T, b)
      2 #print(time.time() - tic)

<ipython-input-10-6f0fd2e2ab70> in gen_data(n, p, T, b)
     10 
     11   # Computing the important controls
---> 12   H1 = np.transpose(np.random.multivariate_normal(mean = np.zeros(b), cov = Sigmah1, size = T))
     13 
     14   # Computing the shocks z1t and the factor g_t stacked in G

TypeError: only integer scalar arrays can be converted to a scalar index

我想先按值递减排序,如果值相同,则按键(体裁名称)递减排序。 例如:

genre_dict = dict()
genre_dict = {'Action':Action, 'Adventure':Adventure, 'Comedy':Comedy, 'History':History, 'Horror':Horror, 'Romance':Romance}
genre_dict = OrderedDict(genre_dict)

我是通过lambda条件完成的,但是对我来说不起作用(最好说我做不到)。

3 个答案:

答案 0 :(得分:3)

这可以使用正确的key一步完成:

OrderedDict(sorted(genre_dict.items(), key=lambda x: (-x[1],x[0])))

OrderedDict([('Action', 3),
             ('Comedy', 2),
             ('History', 2),
             ('Horror', 2),
             ('Romance', 2),
             ('Adventure', 1)])

本质上,排序是基于:

[(-x[1],x[0]) for x in genre_dict.items()]

[(-3, 'Action'),
 (-1, 'Adventure'),
 (-2, 'Comedy'),
 (-2, 'History'),
 (-2, 'Horror'),
 (-2, 'Romance')]

这个小技巧使tuple中两个值的排序可以以ascending的方式完成,这是默认的排序标准。否则,我们必须首先对第二个字段进行降序排序,然后对第一个字段进行升序排序。

答案 1 :(得分:1)

尝试

genre_dict = dict()
genre_dict = {'Action':3, 'Adventure':1, 'Comedy':2, 'History':2, 'Horror':2, 'Romance':2}
new_dict = OrderedDict(sorted(sorted([(k,genre_dict[k]) for k in genre_dict]), key=lambda x: -x[1]))
print(new_dict)

答案 2 :(得分:0)

根据定义,词典是(键,值)对,其中每个键都有唯一的值对。因此,输入无效。如果输入有效,则程序将按预期运行。