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