在Python中按值搜索字典时如何有效地从中提取值列表?

时间:2019-06-14 13:33:19

标签: python dictionary extract

我有一个大的日志文件,将其解析为以下形式的字典后:

data = {id: {"datetime": datetime, "string": string}}

其中:

datetime: str
string: str
id: int    

(带有嵌套字典的字典) 例如:

data = {
0: {"datetime": "03.04.2019", "string":"abc"},
1: {"datetime": "04.04.2019", "string":"abc"},
2: {"datetime": "05.04.2019", "string":"abc"},
3: {"datetime": "05.04.2019", "string":"xyz"},
4: {"datetime": "06.04.2019", "string":"abc"},
5: {"datetime": "06.04.2019", "string":"xyz"},
6: {"datetime": "07.04.2019", "string":"abc"}
}

如您所见,在每个嵌套词典中,日期时间和字符串都不是唯一的。但是,对于每个后续ID,后续日期时间都大于或等于以前的日期时间。

我想创建一个仅提取特定日期时间之间的内部字典的函数。例如我的功能:

def extract(start_datetime, end_datetime, data)
    ...

对于参数:

extract("05.04.2019", "06.04.2019", data)

应返回:

{
2: {"datetime": "05.04.2019", "string":"abc"},
3: {"datetime": "05.04.2019", "string":"xyz"},
4: {"datetime": "06.04.2019", "string":"abc"},
5: {"datetime": "06.04.2019", "string":"xyz"}
}

我正在考虑为自己实现一个二进制搜索功能,该功能将遍历内部日期时间值并仅提取与搜索条件相匹配的内部字典,但是我是一个懒惰的程序员,并且我正在寻找一种更Python的解决方案。由于这是一个很大的数据集,因此效率非常重要,因此功能应尽可能快。

2 个答案:

答案 0 :(得分:0)

另一个可能性是:

import time

def extract(start, end, data): 
    output_dict= {}
    for key, val in data.items(): 
        if (isinstance(val, dict) 
            and time.strftime(val.get('datetime')) >= time.strftime(start) 
            and time.strftime(val.get('datetime')) <= time.strftime(end)): 
            output_dict[key] = val
    return output_dict

extract("05.04.2019", "06.04.2019", data)  

输出:

{2: {'datetime': '05.04.2019', 'string': 'abc'},
 3: {'datetime': '05.04.2019', 'string': 'xyz'},
 4: {'datetime': '06.04.2019', 'string': 'abc'},
 5: {'datetime': '06.04.2019', 'string': 'xyz'}}

答案 1 :(得分:0)

一个衬里排序

import time

data = {
    0: {"datetime": "03.04.2019", "string": "abc"},
    1: {"datetime": "04.04.2019", "string": "abc"},
    2: {"datetime": "05.04.2019", "string": "abc"},
    3: {"datetime": "05.04.2019", "string": "xyz"},
    4: {"datetime": "06.04.2019", "string": "abc"},
    5: {"datetime": "06.04.2019", "string": "xyz"},
    6: {"datetime": "07.04.2019", "string": "abc"}
}

data_in_time_range = [entry for entry in data.values() if
                      time.strftime(entry['datetime']) >= time.strftime('05.04.2019') and time.strftime(
                          entry['datetime']) <= time.strftime('06.04.2019')]
print(data_in_time_range) 

输出:

[{'datetime': '05.04.2019', 'string': 'abc'}, {'datetime': '05.04.2019', 'string': 'xyz'}, {'datetime': '06.04.2019', 'string': 'abc'}, {'datetime': '06.04.2019', 'string': 'xyz'}]