#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}}]
Демонстрация не имеет такого смысла, поскольку нет одинаковых серийных номеров для включения значения метки времени, чтобы что-то изменить.