[英]How do I efficiently extract all elements in a column from a dictionary whose values are 2D lists in Python?
[英]How to efficiently extract lists of values from a dictionary when searching by these values in 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 的解決方案。 因為這是一個大數據集,效率很重要,所以函數要盡可能快。
另一種可能性是:
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'}}
一種襯里
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'}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.