Сортировать словарь списков по второму элементу в каждом списке - PullRequest
0 голосов
/ 23 октября 2018

У меня есть словарь списков, таких как:

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

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

output_dict = { 'a' : [[54, 1, 34], [2, 5, 9], [1, 6, 8]],
                'b' : [[2, 1, 9], [54, 2, 34], [1, 3, 8]],
                'c' : [[1, 1, 8], [54, 7, 34], [2, 9, 9]]
              }

Я пытаюсь:

sorted_dict = dict(sorted(test_dict.items(), key=lambda e: e[1][1]))
sorted_dict.items()

бит, похоже, ничего не делает.

Ответы [ 2 ]

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

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

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

for k, v in test_dict.items():
    test_dict[k] = sorted(v, key=lambda e: e[1])

print(test_dict)

, чтобы создать новый словарь

test_dict = { 'a' : [[1, 6, 8], [2, 5, 9], [54, 1, 34]],
              'b' : [[1, 3, 8], [2, 1, 9], [54, 2, 34]],
              'c' : [[1, 1, 8], [2, 9, 9], [54, 7, 34]]
            }

new_dict = {k:sorted(v, key=lambda e: e[1]) for k, v in test_dict.items()}

print(new_dict)
0 голосов
/ 23 октября 2018

Вы хотите отсортировать списки списков в значениях словаря, не порядок словарных ключей .Для этого вы можете использовать словарь:

res = {k: sorted(v, key=lambda x: x[1]) for k, v in test_dict.items()}

{'a': [[54, 1, 34], [2, 5, 9], [1, 6, 8]],
 'b': [[2, 1, 9], [54, 2, 34], [1, 3, 8]],
 'c': [[1, 1, 8], [54, 7, 34], [2, 9, 9]]}

Для функционального эквивалента вы можете использовать key=operator.itemgetter(1).В Python 3.6+ ваш словарный порядок должен поддерживаться.До версии 3.6 словари не упорядочены, и вы не должны ожидать какого-либо определенного порядка ключей.

Для заказа по ключу вы можете использовать collections.OrderedDict:

from collections import OrderedDict

res_ordered = OrderedDict(sorted(res.items(), key=lambda x: x[0]))

OrderedDict([('a', [[54, 1, 34], [2, 5, 9], [1, 6, 8]]),
             ('b', [[2, 1, 9], [54, 2, 34], [1, 3, 8]]),
             ('c', [[1, 1, 8], [54, 7, 34], [2, 9, 9]])])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...