我有一个类似json的字典,其中包含其他字典和列表,如下所示:
"A": {
"attrib2": "bar",
"attrib1": "foo",
"B": "b",
"C": [
"c1",
"c2"
],
"D": [
{
"attrib3": "baz"
},
{
"attrib4": "muh"
}
]
}
每个值可以是(dictonaries或values)列表,字典或不可变值(如“c1”或5)。
现在我想通过获取它们所需的键来搜索我引用的特定值([“A”,“B”]将指向值“b”)。由于在给定的键路径中可能存在列表,因此我返回所有找到的值。我的功能如下:
def getValues(inputDict, keyList):
"""
works on dicts in json-like format as outputted by complexXmlElement2dict
"""
values = list()
if keyList:
key = keyList.pop(0)
try:
currentValue = inputDict[key]
except KeyError:
logger.debug("could not find key {}".format(key))
return list()
if isinstance(currentValue, dict):
additionalValues = getValues(copy.deepcopy(currentValue), list(keyList)) # copy list and dict!!
values.extend(additionalValues)
elif isinstance(currentValue, list):
for subDict in currentValue:
assert isinstance(subDict, dict)
values.extend(getValues(copy.deepcopy(subDict), list(keyList))) # copy list and dict!!
else:
values.append(currentValue)
return list(values)
正如你所看到的,我对这里使用的可变对象有些偏执。我正在复制剩下的键列表以找到正确的值以及我每次使用的字典。我的功能按预期工作,但我认为我通过不必要地复制所有这些对象来创建大量开销。
我什么时候可以省略复制这个例子中的词典和列表?为什么?试错是没有选择的,因为我没有所有可能的输入词典,也因为我想获得更好的理解。我应该补充一点,我已经阅读了许多python中可变对象的示例和解释,虽然我认为我理解这个概念我觉得不够舒服,但我不认为是不必要的,因为其他人依赖于这段代码的正确性。
getValues(copy.deepcopy(currentValue), list(keyList))
getValues(copy.deepcopy(subDict), list(keyList)))
return list(values)
我正在使用Python 2.7。
答案 0 :(得分:0)
我找不到复制字典或列表的任何理由。您没有更新任何一个。您只是从中提取数据。所以只需在递归函数中传递引用即可。