使用python中的值过滤字典列表

时间:2019-03-06 16:20:16

标签: 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语句解决它,但是,我想要一个更优雅的解决方案。

2 个答案:

答案 0 :(得分:1)

创建一个键为item值的字典。遍历my_json,将value3分配给相应的元素。

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

我假设列表已经按时间戳排序;如果没有,请首先对列表进行排序。

答案 1 :(得分:1)

我已经扩展了上述解决方案,以便在需要时按时间进行排序

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

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