我有嵌套词典
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}}
答案 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 answer到different 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}}