Lord_of_Rings
@Lord_of_Rings
Python developer

Как отсортировать многоуровневый словарь с помощью sorted()?

Всем доброго времени суток! Есть вот такой словарь:
{
    '10.10.100.100': {
        'list1': {
            'count': 5205, 
            'protocols': {
                  'tcp': 432, 
                  'udp': 8796,
            }
         },
         'list2': {
            'count': 23458, 
            'protocols': {
                  'tcp': 189, 
                  'udp': 8,
             },
         },
     },
     # more
}


Задача: отсортировать словарь второго уровня (list1: {}, list2: {}) по count, а в них отсортировать protocols, чтобы получилось вот так
{
    '10.10.100.100': {
        'list2': {
            'count': 23458, 
            'protocols': {
                  'tcp': 189, 
                  'udp': 8,
             }
        },
        'list1': {
            'count': 5205, 
            'protocols': { 
                  'udp': 8796,
                  'tcp': 432,
            },
         },
     },
}


Уже несколько часов никак не могу сообразить как это сделать лучшим способом, чтобы не было говнокода.
  • Вопрос задан
  • 180 просмотров
Решения вопроса 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
# j = {...}
{
  k: {
     **v, 
     'protocols': {
       kk:vv
       for kk, vv in 
       sorted(
         v['protocols'].items(),
         key=lambda kv2: kv2[1],
         reverse=True
       )
     }
  } 
  for k, v in 
  sorted(
    j['10.10.100.100'].items(), 
    key=lambda kv: kv[1]['count'], 
    reverse=True
  )
}

Но вы лучше не делайте таким нечитабельным однострочником. Соберите заново нужные словари в обычных классических циклах, иначе такой код нельзя будет поддерживать норамльно.
Тут смысл в том, что у sorted есть необязательный аргумент, куда можно передать функцию извлечения ключа сортировки. Перебираете сортируемые словари парами (ключ-значение) в нужном порядке и собираете в новые словари.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Обычно сортируют массивы. Это важный смысловой момент. У массивов есть порядок. А в данном документе - одни мапы. Мапы обычно не сортируют потому-что для них сортировка лишена смысла. У них - доступ по ключу а не по порядковому номеру элемента.

Ты это понимаешь?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@deliro
1. Что в этом вопросе сложного?
2. Словарь не может быть отсортирован, сортируются lists. Тебя запутывает то что у словаря ключи отдаются в порядке их вставки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы