Как отсортировать словарь по убыванию значений и по возрастанию длины ключа? - PullRequest
0 голосов
/ 28 июня 2019

Мне нужно получить отсортированный список словарей в порядке убывания, но в порядке возрастания длины ключа без использования модулей.Самый простой способ.

Я пытался сначала отсортировать значения, а затем ключи, но безрезультатно.

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 Ответ

1 голос
/ 28 июня 2019

Вы можете использовать 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.Таким образом, чтобы отсортировать по длине по возрастанию THEN по значению по убыванию, мы делаем длину отрицательной с помощью -len() и устанавливаем reverse=True.Если вы сделали (len(k[0]), -k[1]) с reverse=False, вы должны получить тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...