在函数参数的函数下创建的嵌套数据结构的访问元素

时间:2016-04-29 20:37:54

标签: python list dictionary arguments

我有以下函数,我动态构建了dicts的dict(这里为了简单起见,为了简单而创建了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位置为新值的传递列表,第1位是“外”字典键,第2位是“内部”字典键:

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"]元素。

2 个答案:

答案 0 :(得分:0)

您可以使用**kwargs并检查root,即:

import json

def fun(arg1, arg2, root, **additionalParams):
  DoD = {'a': {'aa':1, 'ab':2}, 'b': {'ba':3, 'bb':4}, 'c': '5'}

  if root:
    DoD[root][additionalParams.keys()[0]] = additionalParams.values()[0]
  else:
    DoD[additionalParams.keys()[0]] = additionalParams.values()[0]

  print json.dumps(DoD, sort_keys=True, indent=4)

TEST1:

fun(1,2, root="b", ba = "new value")

输出:

{
    "a": {
        "aa": 1, 
        "ab": 2
    }, 
    "b": {
        "ba": "new value", 
        "bb": 4
    }, 
    "c": "5"
}

TEST2:

fun(1,2, root=None, c = "new value")

输出:

{
    "a": {
        "aa": 1, 
        "ab": 2
    }, 
    "b": {
        "ba": 3, 
        "bb": 4
    }, 
    "c": "new value"
}

注意:您可以在root中传递**additionalParams,但您应该考虑不保留传递给该函数的关键字参数中的顺序。

答案 1 :(得分:0)

这是一种设置程序的奇怪方法,但假设你有理由我认为你可能正在寻找splat参数[* args]或[** kwargs]。通过splat参数,您可以获得正式的参数" aka"必需的参数"到函数(本例中为dummyArg1,dummyArg2)然后你的splat arg。所以你的def将是

def fun(dummyArg1,dummyArg2,*args):

您的电话将是

fun(1,2,'abc','def',4,'etc')

在代码中,args将表示为元组= ('abc','def',4,'etc')

然后你可以使用你的元组来整理你的字典:

l = len(args)
if l == 3:
  DoD[args[1]][args[2]] = args[0]
elif l == 2:
  DoD[args[1]] = args[0]

当然,如果您有非常深的词典,这可能会变得很麻烦,在这种情况下,您可能希望查看更多complex walking methods