Создание нового словаря для сначала сортировки ключа, а затем сортировки по значению - PullRequest
2 голосов
/ 09 мая 2020

Я понимаю, что инерция отсортирована. Я пытаюсь создать новый словарь, который сортирует в алфавитном порядке по «Ключу», а затем сортирует значения по последнему элементу в кортеже.

Словарь в настоящее время:

D1 = {'Lakers': [('James','PG',23,2), ('Davis', 'PF', 3, 3), ('Johnson', 'PG', 33, 
1)], 'Pistons': [('Billips', 'PG', 1, 1 ), ('Wallace', 'C', 3, 3)], 'Hawks': 
[('Young', 'PG', 11, 1), ('Collins', 'PF', 3, 2)] }

Словарь, который я хочу:

New_D1 = { 'Hawks':[('Collins', 'PF', 3, 2),('Young', 'PG', 11, 1)], 'Lakers': [('Davis', 'PF', 3, 3),('James','PG',23,2), ('Johnson', 'PG', 33, 1)], 'Pistons': [('Wallace', 'C', 3, 3),('Billips', 'PG', 1, 1 ) ] }

Мой текущий код для сортировки:

New_D1  = dict(sorted(D1.items()))

Что создает новый словарь (New_D1) и сортирует только ключи. Теперь мне нужно отсортировать значения в последнем элементе списка кортежей.

Ответы [ 5 ]

2 голосов
/ 09 мая 2020

Вы можете сделать это как понимание поверх того, что вы уже делаете:

>>> {k: sorted(v, key=lambda t: -t[-1]) for k, v in sorted(D1.items())}
{'Hawks': [('Collins', 'PF', 3, 2), ('Young', 'PG', 11, 1)], 'Lakers': [('Davis', 'PF', 3, 3), ('James', 'PG', 23, 2), ('Johnson', 'PG', 33, 1)], 'Pistons': [('Wallace', 'C', 3, 3), ('Billips', 'PG', 1, 1)]}
1 голос
/ 09 мая 2020

Вы можете использовать itemgetter

>>> from operator import itemgetter
>>> {k:sorted(v, key=itemgetter(3)) for k,v in New_D1.items()}

{'Hawks': [('Young', 'PG', 11, 1), ('Collins', 'PF', 3, 2)], 
'Lakers': [('Johnson', 'PG', 33, 1), ('James', 'PG', 23, 2), ('Davis', 'PF', 3, 3)], 
'Pistons': [('Billips', 'PG', 1, 1), ('Wallace', 'C', 3, 3)]}
1 голос
/ 09 мая 2020

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

result ={}
for key, val in sorted(D1.items()):
    result[key] = sorted(val, key=lambda x: x[-1], reverse=True)

Вы можете встроить модификацию и не использовать tierce dict, с dict-computing

D1 = {key: sorted(val, key=lambda x: x[-1], reverse=True) for key, val in sorted(D1.items())}
0 голосов
/ 09 мая 2020

Это очень просто, и вам даже не нужна предложенная выше лямбда-функция:

{k: sorted(v) for k,v in D1.items()}

Это дает результат, который вы ищете:

{'Lakers': [('Davis', 'PF', 3, 3),
  ('James', 'PG', 23, 2),
  ('Johnson', 'PG', 33, 1)],
 'Pistons': [('Billips', 'PG', 1, 1), ('Wallace', 'C', 3, 3)],
 'Hawks': [('Collins', 'PF', 3, 2), ('Young', 'PG', 11, 1)]}
0 голосов
/ 09 мая 2020
{k: sorted(v, key=lambda x: x[:-1]) for k,v in sorted(D1.items(), key=lambda x: x[0])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...