Сортировка словаря по ключу, а затем по значению (список или кортеж?) - PullRequest
0 голосов
/ 10 октября 2018

У меня есть словарь

dict = {key: [a, b, c, d]}

ключ - это строка, a - это число, b - это число, c - это число, d - это число.

Как напечатать мой словарь, отсортированный сначала по номеру в d, , а затем по длине строки в ключе (сначала по наибольшему)?

Я пытался использовать что-то вроде этого ...

for key in sorted(dict.items(), key=lambda x: (-len(x[0]), x[1][3])):

, но я продолжаю получать ошибки атрибутов.

Ответы [ 5 ]

0 голосов
/ 10 октября 2018

Вы можете сохранить свой словарь без изменений и отсортировать его, используя конструктор dict()

d = dict(sorted(d.items(), key=lambda x: (x[1][3], -len(x[0]))))
# {'stampede': [4, 2, 1, 1], 'the': [3, 3, 2, 1], 'vash': [1, 2, 3, 4]}
0 голосов
/ 10 октября 2018

Ваш код работает, но, вероятно, не соответствует «правильному» поведению, которое вы ищете, потому что у вас неправильные отрицательные признаки.Вы, вероятно, делаете что-то не так с вашей переменной key, потому что, когда вы сортируете с dict.items(), она возвращает вам кортеж с (key, value)

Это длинный кадр, но я предполагаю, что вы 'Вы пытаетесь это сделать?

for key in sorted(dict.items(), key=lambda x: (-len(x[0]), x[1][3])):
    print(dict[key])

Это неверно, поскольку «ключ» возвращает кортеж.

Чтобы сделать это так, чтобы вам было легче это понять, было бы следующее.

for key, value in sorted(d.items(), key=lambda x: (x[1][-1], -len(x[0]))):
    print(key, value)

Почему возвращается список кортежей?Потому что dict.items() - это список кортежей, и вы сортируете этот список кортежей, а не объект словаря.

0 голосов
/ 10 октября 2018

(бесстыдно крадет пример для jpp)

Вы можете сделать:

di = {'ads': [4, 6, 1, 4], 'bs': [1, 3, 1, 9], 'cfsdg': [6, 1, 5, 4], 'ddsf': [5, 1, 6, 4]}
print('\n'.join(map(str, sorted(di.items(), key=lambda t: (t[1][-1], -len(t[0]))))))

Печать:

('cfsdg', [6, 1, 5, 4])
('ddsf', [5, 1, 6, 4])
('ads', [4, 6, 1, 4])
('bs', [1, 3, 1, 9])
0 голосов
/ 10 октября 2018

Вы можете сделать что-то в этом роде:

>>> dictionary = {'aaaa': [1,2,2,3], 'aa': [1,2,2,3], 'aaa': [2,2,2,2], 'a': [4,2,2,6]}
>>> arr = sorted(dictionary.items(), key=lambda x: (-x[1][3],-len(x[0])))
>>> for k in arr:
        print(k)

('a', [4, 2, 2, 6])
('aaaa', [1, 2, 2, 3])
('aa', [1, 2, 2, 3])
('aaa', [2, 2, 2, 2])

Примечание: сначала сортируйте по большему d, затем длиннее key.

Чтобы отменить порядок,любых приоритетов, просто экспериментируя с удалением / оставлением - в элементах набора в функции lambda.

0 голосов
/ 10 октября 2018

Словари являются неупорядоченными коллекциями, если вы не используете Python 3.6+.Поэтому я предполагаю, что вы хотите построить OrderedDict в соответствии с вашими 2 критериями.Для этого вы можете использовать sorted с пользовательским ключом, а затем ввести OrderedDict:

from collections import OrderedDict

d = {'ads': [4, 6, 1, 4], 'bs': [1, 3, 1, 9], 'cfsdg': [6, 1, 5, 4], 'ddsf': [5, 1, 6, 4]}

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

OrderedDict([('cfsdg', [6, 1, 5, 4]),
             ('ddsf', [5, 1, 6, 4]),
             ('ads', [4, 6, 1, 4]),
             ('bs', [1, 3, 1, 9])])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...