gpt4 book ai didi

Python 嵌套字典使用列表中的项目

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:51 24 4
gpt4 key购买 nike

这是一个与提供的解决方案相关的问题here ,它涉及以下代码作为解决方案:

from collections import MutableMapping

def set_value(d, keys, newkey, newvalue, default_factory=dict):
"""
Equivalent to `reduce(dict.get, keys, d)[newkey] = newvalue`
if all `keys` exists and corresponding values are of correct type
"""
for key in keys:
try:
val = d[key]
except KeyError:
val = d[key] = default_factory()
else:
if not isinstance(val, MutableMapping):
val = d[key] = default_factory()
d = val
d[newkey] = newvalue

我希望有人可以向我解释这段代码为何有效。我很困惑传入的 dict 'd' 是如何在 d = val 的地方不断被覆盖的。 dict 'd' 如何在不索引到下一个节点的情况下继续获取更多的嵌套字典?抱歉,如果这没有意义,我不明白它是如何工作的。

感谢您的帮助!

最佳答案

d反弹;变量被更新为指向每个循环中的 val

对于 keys 中的每个 key,找到该键(val = d[key] 成功)或 default_factory () 用于为该键创建一个新值。

如果找到键但值不是 MutableMapping 类型,则找到的值将替换为新的 default_factory() 结果。

一旦为这个级别确定了新值,d 就被告知忘记旧字典并指向新字典。

重新绑定(bind)不会更改旧值。它只是停止引用那个旧值。

让我们用一个简单的例子:

>>> d = {'foo': {}}
>>> keys = ['foo']
>>> newkey = 'bar'
>>> newval = 'eggs'
>>> original = d

一开始,originald 是同一个对象。将这里的名称想象成纸质标签,将它们的值想象成气球。标签用绳子系在气球上。在上面的示例中,doriginal 标签绑定(bind)到同一个字典气球。

当我们进入 for key in keys 循环时,d[key] 查找成功并且 vald['foo'],一个空字典:

>>> key = keys[0]
>>> key
'foo'
>>> val = d[key]
>>> val
{}

这是一个常规的 Python 字典,isinstance(val, MutableMapping)True。下一行重新绑定(bind) d 标签到那个字典。该字符串只是从原始字典中解开,现在附加到同一个气球 val 绑定(bind)到:

>>> d = val
>>> d
{}
>>> original
{'foo': {}}
>>> d is val
True
>>> d is original
False

原始字典没有被重新绑定(bind)改变!

用完 key (keys 中只有一个),下一部分将 newval 分配给 d[newkey]:

>>> d[newkey] = newval
>>> d
{'bar': 'eggs'}

但是,d 并不是附加到该词典气球的唯一标签。字典本身包含键和值,它们都是与气球相关的标签! original标签仍然绑定(bind)在外层字典气球上,它有一个foo键关联值,绑定(bind)在一个嵌套字典上,就是这个嵌套字典我们刚刚改变:

>>> original
{'foo': {'bar': 'eggs'}}

该算法仅通过字符串跟随标签到新词典。

使用更复杂的组合键只意味着要跟踪更多的字符串,可能还会增加一个额外的字典来绑定(bind)。

关于Python 嵌套字典使用列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com