如何按降序和键长排序字典?

时间:2019-06-28 09:48:30

标签: python-3.x sorting

我需要在不使用模块的情况下,以键长的降序但以升序来获得字典的排序列表。最简单的方法。

我尝试先对值进行排序,然后对键进行排序,但无济于事。

python

data = {'Nikita': 1, 'Vectoran': 1, 'Aleksei': 2, 'Maksim': 1,
    'Anton': 1, 'Dmitriy': 1, 'Viktor': 3, 'Sergey': 5,
    'Pavel': 1, 'Roman': 1, 'Artemiy': 1, 'Stepan': 1,
    'Evgeniy': 2, 'Ivan': 1, 'Aleksandr': 2, 'Vadim': 1,
    'Abbas': 1, 'Anna': 1}

newdata = data.items()
res = sorted(newdata, key=lambda k: (k[1],k[0]), reverse=True)
print(res)



*output*

[('Sergei', 5), ('Viktor', 3), ('Evgeniy', 2), ('Aleksei', 2), 
('Aleksandr', 2) .....]

*needed*
               len4         len4         len5          len5           
for example [('Anna', 1), ('Ivan', 1), ('Vadim', 1), ('Roman', 1), 
   len6           len6           len7            len7
('Sergey', 5), ('Viktor', 3), ('Evgeniy', 2), ('Dmitriy', 1)......]

1 个答案:

答案 0 :(得分:1)

您可以使用len并在lambda函数中将其取反。

这应该给您您想要的东西:

res = sorted(newdata, key=lambda k: (-len(k[0]), k[1]), reverse=True)

**Output**
[('Anna', 1), ('Ivan', 1), ('Roman', 1), ('Anton', 1), ('Abbas', 1), 
 ('Vadim', 1), ('Pavel', 1), ('Sergey', 5), ('Viktor', 3), ('Nikita', 1), 
 ('Maksim', 1), ('Stepan', 1), ('Aleksei', 2), ('Evgeniy', 2), 
 ('Dmitriy', 1), ('Artemiy', 1), ('Vectoran', 1), ('Aleksandr', 2)]

编辑:更多解释

因为您想按长度升序进行排序,但将值降序排序。如果两个数字均为正数((len(k[0]), k[1])),则最终将按长度排序,然后按值排序,但根据设置reverse的不同,两个数字都将升序或降序。因此,为了按长度递增,然后按值递减排序,我们用-len()使长度为负,并设置reverse=True。如果您对(len(k[0]), -k[1])做过reverse=False,则应该得到相同的结果。