为字典添加默认时间

时间:2018-01-26 12:27:54

标签: python dictionary time

我有嵌套词典

default=time.time()
a={"key":{"key_value":"value", "time": default}}

当我更改字典时,时间是否可能会自动更改?

例如,

a
Out[40]:
{'key': {'key_value': 'value', 'time': 1516968395.7678363}}

当我更改key_value时:

a["key"]["key_value"]="value2"

它仍然给我同一时间,但我需要更新当前时间

a
Out[44]:
{'key': {'key_value': 'value2', 'time': 1516968395.7678363}}

2 个答案:

答案 0 :(得分:1)

我认为有两种方法可以解决这个问题。您可以将dict子类化为每个添加或修改附加修改时间的新类,或者您可以创建函数来修改也附加修改时间的现有dict

子类化可能是一种更健壮的方法,但我认为后者可能更容易/更易读,所以快速尝试这种方法:

import time

def nested_dict_updater(dict, top_key, nested_key, value):
    dict[top_key][nested_key] = value
    dict[top_key]['modification_time'] = time.time()

# Original dict
now = time.time()
d = {"top_key": {"nested_key": "value", "modification_time": now}}
print(d)

# Updated dict
nested_dict_updater(d, "top_key", "nested_key", "new_value")
print(d)

# Add another nested key and value
nested_dict_updater(d, "top_key", "another_key", "second_value")
print(d)

这个简单的函数允许您更新任何嵌套键值,或添加带有值的新嵌套键,并记录该顶级键的修改时间。

答案 1 :(得分:0)

扩展我的评论,其灵感来自this answerdifferent question(如果你喜欢这个评论,请点赞一下):

您可以将键"time"的值指定为lambda函数。

default=time.time()
a={"key":{"key_value":"value", "time": lambda: default}}

但如果你要打印a,你会看到:

>>> print(a)
{'key': {'key_value': 'value', 'time': <function <lambda> at 0x7f39aa90cc08>}}

因此,创建一个辅助函数,在需要时将default的当前值分配给键"time"

def get_my_dict(a, time_key="time"):
    d = {}
    d = {
        k:(a[k]() if k == time_key else a[k])
         if not isinstance(a[k], dict) 
         else get_my_dict(a[k]) for k in a
    }
    return d

在这种情况下,我使用递归遍历所有嵌套字典,寻找time_key。如果找到,则调用该函数(注意括号) - 否则返回该值。您可以根据需要简化此操作。

现在您可以执行以下操作:

>>> new_a = get_my_dict(a)
>>> print(new_a)
{'key': {'key_value': 'value', 'time': 1516979156.041796}}

如果我们随后更新default

>>> default = 0
>>> new_a = get_my_dict(a)
>>> print(new_a)
{'key': {'key_value': 'value', 'time': 0}}

<强>更新

如果您需要当前时间,只需将lambda功能更改为time.time

a={"key":{"key_value":"value", "time": time.time}}

请注意time.time后没有括号。除了拨打get_my_dict(a)之外,其他所有内容的工作方式都相同,您将获得当前时间。

print(a)
{'key': {'key_value': 'value', 'time': <built-in function time>}}

new_a = mydict(a)
print(new_a)
{'key': {'key_value': 'value', 'time': 1516980015.325011}}

# wait a little and try again:
new_a = mydict(a)
print(new_a)
{'key': {'key_value': 'value', 'time': 1516980069.949716}}