我需要在不使用模块的情况下,以键长的降序但以升序来获得字典的排序列表。最简单的方法。
我尝试先对值进行排序,然后对键进行排序,但无济于事。
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)......]
答案 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
,则应该得到相同的结果。