Python过滤并从字典列表中创建字典

时间:2019-07-16 16:13:53

标签: python python-3.x

我有字典

[{
    'bytesUsed': 79095,
    'servicePlan': '25MB',
    'smsUsed': 0,
    'source': 'Raw Usage',
    'timestamp': '2019-02-28T19:00:00-05:00'
}, {
    'bytesUsed': 310435,
    'servicePlan': '25MB',
    'smsUsed': 0,
    'source': 'Raw Usage',
    'timestamp': '2019-04-01T19:00:00-05:00'
}, {
    'bytesUsed': 286033,
    'servicePlan': '25MB',
    'smsUsed': 0,
    'source': 'Raw Usage',
    'timestamp': '2019-05-06T19:00:00-05:00'
}]

如果timestamp字段不在范围内,我想过滤dict(2019-02-11T19:00:00-05:00-2019-04-10T19:00:00-05:00 )并创建

之类的key:value映射
{'2019-02-28T19:00:00-05:00' : 79095, '2019-04-01T19:00:00-05:00' : 310435} 

什么是有效的方法?

目前,我正在为&if在列表中的每个字典上这样做,这很耗时。

2 个答案:

答案 0 :(得分:1)

我猜到你想得到什么。不幸的是,您的预期输出不清楚。

我一直是dateutil模块的粉丝。

from dateutil.parser import parse
dt1 = parse("2019-02-11T19:00:00-05:00")
dt2 = parse("2019-04-10T19:00:00-05:00")

newdl = []
for dic in dictlist:
    dt = parse(dic['timestamp'])
    if dt1 <= dt <= dt2:
        newdl.append({dic['timestamp'] : dic['bytesUsed']})
print(newdl)

输出:

[{'2019-02-28T19:00:00-05:00': 79095}, {'2019-04-01T19:00:00-05:00': 310435}]

如果您认为您将要再次使用日期时间,则将dt设为键而不是字符串;这样可以避免以后再解析该字符串。

尽管我会小心地使用任何日期(字符串或日期时间)作为字典键,除非您可以保证它们始终是唯一的。

答案 1 :(得分:1)

尝试一下

from dateutil.parser import parse

start_dt = parse("2019-02-11T19:00:00-05:00")
end_dt = parse("2019-04-10T19:00:00-05:00")

arr = [
    {
        'bytesUsed': 79095,
        'servicePlan': '25MB',
        'smsUsed': 0,
        'source': 'Raw Usage',
        'timestamp': '2019-02-28T19:00:00-05:00'
    },
    {
        'bytesUsed': 310435,
        'servicePlan': '25MB',
        'smsUsed': 0,
        'source': 'Raw Usage',
        'timestamp': '2019-04-01T19:00:00-05:00'
    },
    {
        'bytesUsed': 286033,
        'servicePlan': '25MB',
        'smsUsed': 0,
        'source': 'Raw Usage',
        'timestamp': '2019-05-06T19:00:00-05:00'
    }
]

result = {i['timestamp']: i['bytesUsed'] for i in arr if start_dt <= parse(i['timestamp']) <= end_dt}
print(result)

输出:

{'2019-02-28T19:00:00-05:00': 79095, '2019-04-01T19:00:00-05:00': 310435}

如果您没有dateutil模块,可以使用pip install python-dateutil命令来实现。确实没有得到您的输出,如果这不是您期望的,请在此答案中添加评论。