Фильтрация списка словарей с использованием его значений в python

#python #json

#python #json

Вопрос:

У меня есть список словарей, которые я хотел бы отфильтровать и создать вектор, соответствующий значениям списка. Этот список файлов содержит несколько записей, где у каждой есть поле time, item, state: {values1, value2, value3} . Переменная item может принимать следующие 11 значений [0.0, 0.1, 0.2, 0.3 ... 1.0] . Для каждого из значений которого я хотел бы найти соответствующие value3 значения и создать вектор из 11 элементов, где каждый из них должен соответствовать value3 для соответствующей item переменной. Например, если мой список:

 my_json = [{'time': datetime.datetime(2018, 7, 4, 13, 42, 55, 613000), 'item': 0.3, 'state': {'value1': 0.0, 'value2': 0.167, 'value3': 0.833}}
{'time': datetime.datetime(2018, 7, 6, 9, 40, 54, 44000), 'item': 0.6, 'state': {'value1': 0.0, 'value2': 0.273, 'value3': 0.727}}
{'time': datetime.datetime(2018, 7, 6, 10, 0, 16, 507000), 'item': 0.5, 'state': {'value1': 0.0, 'value2': 0.0, 'value3': 1.0}}
{'time': datetime.datetime(2018, 7, 6, 10, 37, 16, 769000), 'item': 0.5, 'state': {'value1': 0.0, 'value2': 0.0, 'value3': 1.0}}
{'time': datetime.datetime(2018, 7, 6, 10, 38, 28, 948000), 'item': 0.5, 'state': {'value1': 0.0, 'value2': 0.143, 'value3': 0.857}}
{'time': datetime.datetime(2018, 7, 6, 10, 41, 11, 201000), 'item': 0.4, 'state': {'value1': 0.0, 'value2': 0.091, 'value3': 0.909}}
{'time': datetime.datetime(2018, 7, 6, 11, 45, 25, 145000), 'item': 0.1, 'state': {'value1': 0.0, 'value2': 0.083, 'value3': 0.917}}
{'time': datetime.datetime(2018, 7, 6, 11, 46, 31, 508000), 'item': 0.1, 'state': {'value1': 0.0, 'value2': 0.0, 'value3': 1.0}}
{'time': datetime.datetime(2018, 7, 6, 11, 46, 33, 120000), 'item': 0.1, 'state': {'value1': 0.0, 'value2': 0.214, 'value3': 0.786}}
{'time': datetime.datetime(2018, 7, 6, 12, 36, 25, 695000), 'item': 0.0, 'state': {'value1': 0.0, 'value2': 0.0, 'value3': 1.0}}
{'time': datetime.datetime(2018, 7, 6, 12, 37, 35, 721000), 'item': 0.0, 'state': {'value1': 0.0, 'value2': 0.0, 'value3': 1.0}}]
  

Желаемый результат приведенного выше примератаков: [1.0, 0.76, 0.0, 0.833, 0.909, 0.857, 0.727, 0.0, 0.0, 0.0, 0.0] то есть сохраняется также самое последнее значение (при наличии нескольких значений элемента) с учетом времени. Я пытался решить эту проблему с помощью операторов if-else, однако мне хотелось бы более элегантного решения.

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

1. Можете ли вы привести пример того, что вы безуспешно пытались?

2. Я попытался реализовать логику if-else, которая на самом деле работала должным образом, но я бы, если возможно, что-нибудь более элегантное.

3. Это недопустимый файл JSON. Если у вас есть несколько объектов в файле JSON, их необходимо обернуть в массив.

4. JSON также требует заключения строк в двойные кавычки, а не в одинарные, и не допускает вызовов функций.

5. @Barmar перед ним также нет my_json = . Я думаю, что это проанализированный json : P

Ответ №1:

Создайте словарь, ключами которого являются item значения. Выполняйте цикл my_json , присваивая value3 соответствующему элементу.

 d = {}
for i in my_json:
    d[i['item']] = i['state']['value3']
  

Я предполагаю, что список уже отсортирован по временной метке; если нет, сначала отсортируйте список.

Ответ №2:

Я расширил вышеупомянутое решение, включив сортировку по времени на случай, если это необходимо

 sorted_list = sorted(my_json, key=lambda k: k['time'])    

d = {}
for i in sorted_list:
    d[i['item']] = i['state']['value3']