@Lepilov

Как отсортировать словарь со вложенными словарями по длине значения?

Есть такой словарь , по результату сортировки нужно получить словарь упорядоченный по длине значений внутренних словарей
s = {
    129969536777: 
        {
            'video': 
            [
                'customers/2309565764/assets/20029085042', 
                'customers/2309565764/assets/20029089104', 
                'customers/2309565764/assets/20033811553'
                ], 
            'images': 
                [
                    'customers/2309565764/assets/20029085042', 
                    'customers/2309565764/assets/20029085045'
                    ]
            
        }, 
    129969536817: 
        {'video': 
            [
                'customers/2309565764/assets/19216519025', 
                'customers/2309565764/assets/19224387517', 
                'customers/2309565764/assets/19251302439'
                ]
            
        }, 
    129969536857: 
        {'video': 
            [
                'customers/2309565764/assets/20029091369', 
                'customers/2309565764/assets/20029091753',  
                'customers/2309565764/assets/19251302592',  
                'customers/2309565764/assets/19251302592'
                ]
            
        },
    129969536444: {}
    }


Внутри вложенного словаря в качестве значений могут быть ключи image, video с разными размерами списков. Так же ключ может иметь пустой словарь в качестве значения. В результате сортировки элементы с максимальным размером сипска идут вначале последовательности.

Например у ключа 129969536777 есть и image и video и в совокупности длина значений по этим ключам == 5 , следовательно 129969536777 останется на первом месте резульирующй последовательности. 129969536857 имеет длину значения == 4 , он будет на второй позиции и т.д.

городить цикл не вариант, пробую через sorted()

res = (sorted(s,  key = lambda k: len(s[k].values()),  reverse=True))


Но получаю
[129969536777, 129969536817, 129969536857, 129969536444]


неправильная последовательность + нет значений

порядок должен быть таким
[129969536777, 129969536857, 129969536817 , 129969536444]


Если пробую со значениями
res = (sorted(s.keys(),  key = lambda k: len(s[k].values()),  reverse=True))


то получаю ошибку

TypeError: unhashable type: 'dict'
  • Вопрос задан
  • 519 просмотров
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Там получаются вложенные списки в случае, если ключей больше одного. Можно через itertools распаковать. Может, можно как-то легче

import itertools
res = sorted(s, key = lambda k: len(list(itertools.chain.from_iterable(s[k].values()))), reverse=True)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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