簡體   English   中英

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM