首页 > 解决方案 > 在 Python 中按这些值搜索时,如何有效地从字典中提取值列表?

问题描述

我有一个很大的日志文件,在解析成字典后,它采用以下形式:

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"}
}

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

标签: pythondictionaryextract

解决方案


一种衬里

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'}]

推荐阅读