【发布时间】:2026-01-20 01:30:01
【问题描述】:
我有以下功能,我动态构建字典的字典(为了简单起见,这里 DoD 是静态创建的):
import json
def fun(dummyArg1, dummyArg2):
DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}
print json.dumps(DoD, sort_keys=True, indent=4)
# FURTHER CODE THAT WILL WORK WITH DoD VARIABLE GOES HERE
In [1]: fun(1,2)
Out[1]:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": 3,
"bb": 4
},
"c": "5"
}
是否可以在函数调用期间指定特定的DoD 元素内容?我想要类似的东西:
fun(dummyArg1, dummyArg2, DoD["b"]["ba"] = "New Value")
我知道这是可能的,例如通过传递列表,其中第 0 个位置是新值,第一个位置是“外部”字典键,第二个位置是“内部”字典键:
import json
lst = ["New Value", "b", "ba"]
def fun(arg1, arg2, additionalParams):
DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}
DoD[additionalParams[1]][additionalParams[2]] = additionalParams[0]
print json.dumps(DoD, sort_keys=True, indent=4)
# FURTHER CODE THAT WILL WORK WITH DoD VARIABLE GOES HERE
In [1]: fun(1,2,lst)
Out[1]:
{
"a": {
"aa": 1,
"ab": 2
},
"b": {
"ba": "New Value",
"bb": 4
},
"c": "5"
}
但正如您所见,它不是很健壮(更改键 'c' 下的值需要重写函数代码)也不优雅。有更好的方法吗?
额外问题:为什么在分配 "ba" 后的最后一个示例中包含 ["New Value"] 而不是 "New Value"?
PS:即使DoD 是动态创建的,也总会有DoD["b"]["ba"] 元素。
【问题讨论】:
-
我可以回答你的额外问题 - 你设置 DOD['b']['ba'] = [ additionalParams[0] ]。 additionalParams[0] 是一个字符串,[additionalParams[0]] 是包含在列表中的相同字符串。关于您的其余问题,我不确定我是否理解您要做什么。您能否详细说明您希望您的功能做什么?它的输入是什么,期望的输出是什么?
-
@BHawk 谢谢,这是一个错字。所需的输入是这样的:
fun(dummyArg1, dummyArg2, DoD["b"]["ba"] = "New Value")你可以在最后一个代码 sn-p 上看到所需的输出。 -
您可以将附加参数放入字符串中,然后执行 eval。在其他情况下,将执行分配... DoD 未在该范围内定义,因此会失败。将其添加到范围中对您定义整个 DoD 并将其作为参数传递没有太大帮助。
标签: python list dictionary arguments