@maryaTurova

Сортировка словаря по нескольким значениям с условием по time.time()?

Уважаемые!
Мне необходимо отсортировать словарь по нескольким значениям ('loss' и 'average_time') с условием что "status"= False и "next_time" меньше time.time().
obj = {    
        "key-1": {
            "loss": 0,
            "next_time": 1640891811,
            "status": False,
            "average_time":0
        },  
        "key-2": {
            "loss": 1,
            "next_time": 1640891830,
            "status": True,
            "average_time":0
        },  
        "key-3": {
            "loss": 1,
            "next_time": 1650891843,
            "status": False,
            "average_time":0
        }
    }
sort_arr = sorted(obj, key=lambda x: (obj[x]['loss'], obj[x]['average_time']))

Можно конечно сначала создать новый словарь и перебором добавить по этим условиям а дальше уже sorted.
Но я все таки надеюсь что есть более простое решение.
Спасибо!!!
  • Вопрос задан
  • 291 просмотр
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну во-первых, обычные словари сортировке не особенно поддаются. Порядок перебора ключей в словаре не определён, если я не путаю - нет гарантии, что на разных машинах, или на разных версиях питона, или даже при разных запусках скрипта порядок будет одним и тем же.
Есть, правда, collections.OrderedDict - вот они запоминают порядок ключей, но это порядок всегда хронологический - самый поздний заданный ключ всегда будет последним при переборе.
Во-вторых, лучше декомпозируй задачу на две. Сначала отфильтруй нужное, потом уже сортируй. Делать всё за один проход трудно, да и нужно ли?

Я бы вообще посоветовал временно представить словарь как список кортежей (ключ, значение), и фильтровать/сортировать этот список.
Ответ написан
Ваш ответ на вопрос

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

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