【问题标题】:Deleting Keys (datetime objects) of dict in efficient way以有效的方式删除dict的键(日期时间对象)
【发布时间】:2021-09-13 23:45:49
【问题描述】:

我有一个(嵌套的)字典。键是日期时间对象。我试图只保留最新的项目,在这种情况下,应该删除所有超过 60 秒的项目。

由于应用程序对时间要求很高,因此我正在寻找更快的解决方案。我怀疑我的解决方案是否好/快,或者认为有更快的解决方案。

谁能给我一个想法,我可以如何解决它以节省一些步骤和时间。

代码:

import datetime
import copy

test = {'record1': {datetime.datetime(2021, 9, 14, 1, 3, 3, 781905): 'A', datetime.datetime(2021, 9, 14, 1, 4, 3, 876008): 'B', datetime.datetime(2021, 9, 14, 1, 36, 6, 557661): 'C' }}
dict2 = copy.deepcopy(test)
keys = dict2["record1"].keys()
compare = datetime.datetime.now() - datetime.timedelta(seconds=60)

for key in keys:
    
    if key >= compare:
        print(key)
    else:
        del test['record1'][key]

print(test)

输出:

2021-09-14 01:36:06.557661
{'record1': {datetime.datetime(2021, 9, 14, 1, 36, 6, 557661): 'C'}}

【问题讨论】:

  • 如果我使用原始字典并尝试删除我得到的项目:RuntimeError: dictionary changed size during iteration。你的第二个建议绝对有道理

标签: python dictionary datetime key


【解决方案1】:

您不必制作字典的deepcopy - 您可以将字典理解与过滤一起使用。例如:

import datetime

test = {
    "record1": {
        datetime.datetime(2021, 9, 14, 0, 3, 3, 781905): "A",
        datetime.datetime(2021, 9, 14, 0, 4, 3, 876008): "B",
        datetime.datetime(2021, 9, 14, 0, 7, 6, 557661): "C",
    }
}

compare = datetime.datetime.now() - datetime.timedelta(seconds=60)

test = {
    k: {kk: vv for kk, vv in v.items() if kk > compare} for k, v in test.items()
}
print(test)

打印:

{'record1': {datetime.datetime(2021, 9, 14, 0, 7, 6, 557661): 'C'}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多