exibite777
@exibite777
Ведущий системный аналитик

Как отсортировать словарь через sorted() с использованием лямбды в параметре key?

Имеем словарь словарей, который получаем вот так
Добываем словарь словарей
for elem in cur.fetchall():
        if elem[0] in publist:
            publist[elem[0]]["cat_id"].add(elem[5])
            
        else:
            publist[elem[0]]={"title": elem[1],
                      "text": elem[2],
                      "date": elem[3],
                      "author": elem[4],
                      "cat_id": {elem[5]
                                 }}
Пытаемся отсортировать вот так
Сортируем
pub_sorted=sorted(publist,
                key=lambda elem:datetime.strptime(elem["date"], "%d.%m.%Y %H:%M:%S"),
                reverse=True)

Получаем ошибку TypeError: 'int' object is not subscriptable
Такое ощущение, что sorted отдает во входящие параметры key ключи словаря,
понятное что они не вызываются по ключу
ЧТЯДНТ подскажите плиз?

Аналогичный замут со списком словарей прокатывает нормально
Добываем список словарей
worklist=[{"work_id": elem[0],
              "title": elem[1],
              "date": elem[2],
              "customer": elem[3],
              "author": elem[4],
              "workfrom": elem[5],
              "workto": elem[6]
        } for elem in cur.fetchall()]
Сортируем
work_sorted=sorted(worklist(),
                key=lambda work:datetime.strptime(work["workfrom"], "%d.%m.%Y"),
                reverse=True)
  • Вопрос задан
  • 197 просмотров
Решения вопроса 2
ruzzz
@ruzzz
C++/Python
sorted принимает итерируемый объект.
sorted(publist, ...), где publist - это словарь, итерирует по ключам словаря, так работает итерация для словаря в питоне.
sorted(publist.items(), ...) - итерирует по кортежам (tuples) вида (ключ, значение) из словаря.
Именно от этого и такой выход из sorted. Она отдает отсортированное, то что приняла.

Кстати, лишь недавно в питоне (3.7 официально и 3.6 по факту, вроде) словарь по умолчанию помнит порядок ключей, добавленных в него.

Возможно стоит продумать, что и в какой точке кода важнее: быстрый доступ к данным по ключу словаря, или же работа с отсортированными данными. Можно отсоритовать в тот момент, когда это действительно нужно.
Ответ написан
Комментировать
exibite777
@exibite777 Автор вопроса
Ведущий системный аналитик
Как вариант можно сделать вот так
pub_sorted=sorted(publist.items(),
                key=lambda elem: datetime.strptime(elem[1]["date"], "%d.%m.%Y %H:%M:%S"),
                reverse=True)
И судя по данным реально сортирует, но данные в итоге не в виде словаря,
а ввиде списка кортежа
[(key, dict-value), (key, dict-value)
   (key, dict-value)]

Может все таки есть более элегантный способ?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы