Как отсортировать список словарей по значению ключа и по значению значения ключа?

#python #list #sorting #dictionary

#python #Список #сортировка #словарь

Вопрос:

 {
    "states": [
        {
            "timestamp": {
                "double": 968628281.0
            },
            "sensorSerialNumber": 13020235
        },
        {
            "timestamp": {
                "double": 964069109.0
            },
            "sensorSerialNumber": 13020203
        },
        {
            "timestamp": {
                "double": 9641066.0
            },
            "sensorSerialNumber": 30785
        }
    ]
}
  

Есть ли способ отсортировать этот список словарей по «sensorSerialNumber» и по этому числу внутри значения «timestamp» (9.68628281E8),

 "timestamp":{"double":9.68628281E8}
  

использование встроенной функции (сортировка)

 from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name'))
  

Однако мой вопрос немного отличается от других вопросов. Если бы внутри словаря не было словаря, мне просто нужно было бы добавить строку второго ключа во встроенную функцию, например:

 from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name', 'age'))
  

Комментарии:

1. сортировка (clean_sensors_data[«состояния»], ключ = лямбда user: (user[«sensorSerialNumber»], user [«timestamp»] [«double»])) это решение

Ответ №1:

key может быть любым вызываемым, он передается каждому элементу list_to_be_sorted по очереди. Итак, a lambda подойдет здесь:

 newlist = sorted(
    data['states'],
    key=lambda i: (i['sensorSerialNumber'], i['timestamp']['double']))
  

Таким образом, лямбда-выражение возвращает значение для 'sensorSerialNumber' ключа в качестве первого элемента кортежа, а значение для 'double' ключа из словарного значения для 'timestamp' ключа.

ДЕМОНСТРАЦИЯ:

 >>> data = {"states" :
... [{"timestamp":{"double":9.68628281E8},"sensorSerialNumber":13020235},
... {"timestamp":{"double":9.64069109E8},"sensorSerialNumber":13020203},
... {"timestamp":{"double":9641066.0},"sensorSerialNumber":30785}]
... }
>>> sorted(data['states'], key=lambda i: (i['sensorSerialNumber'], i['timestamp']['double']))
[{'timestamp': {'double': 9641066.0}, 'sensorSerialNumber': 30785}, {'timestamp': {'double': 964069109.0}, 'sensorSerialNumber': 13020203}, {'timestamp': {'double': 968628281.0}, 'sensorSerialNumber': 13020235}]
>>> from pprint import pprint
>>> pprint(_)
[{'sensorSerialNumber': 30785, 'timestamp': {'double': 9641066.0}},
 {'sensorSerialNumber': 13020203, 'timestamp': {'double': 964069109.0}},
 {'sensorSerialNumber': 13020235, 'timestamp': {'double': 968628281.0}}]
  

Демонстрация не имеет такого смысла, поскольку нет одинаковых серийных номеров для включения значения метки времени, чтобы что-то изменить.