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

在Python中按值搜索时,如何有效地从字典中提取值列表?,python,dictionary,extract,Python,Dictionary,Extract,我有一个很大的日志文件,在解析到字典后,它的形式如下: data = {id: {"datetime": datetime, "string": string}} 其中: datetime: str string: str id: int (带嵌套dict的dict) 例如: data = { 0: {"datetime": "03.04.2019", "string":"abc"}, 1: {"datetime": "04.04.2019", "string":"abc"}, 2:

我有一个很大的日志文件,在解析到字典后,它的形式如下:

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

datetime: str
string: str
id: int    
(带嵌套dict的dict) 例如:

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"}
}
正如您所看到的,datetime和string在每个嵌套字典中都不是唯一的。但是,对于下面的每个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"}
}

我在考虑自己实现一个二进制搜索函数,该函数将遍历内部datetime值并只提取与搜索条件匹配的内部dict,但是我是一个懒惰的程序员,我正在寻找一个更具python风格的解决方案。由于这是一个大型数据集,效率非常重要,因此函数应尽可能快。

另一种可能性是:

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)  

有点像一艘班轮

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,value}
不是一个集合,请修复它不是一个免费的编码、教程或研究站点。请努力定义你想做什么,然后去做,并且只有当你遇到这样的问题时才发布一个问题。如果你想使用二进制搜索,那么你应该有一个列表,而不是dict。二进制搜索算法由模块实现(如果
对分
有一个
参数,而这个键没有,那么它会更简单一些,但是现在你可能需要一个元组列表
('YYYY.MM.DD',)
)。
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'}]