目标是编写一个函数,返回所有存储单元放在一起的总数量(马德里,巴塞罗那和塞维利亚),我确实认为最好使用递归来解决这个问题,但我似乎无法解决!我有这本字典:
Storage = {
"Madrid": [
{"name": "pencil", "quantity": 5},
{"name": "cam", "quantity": 11},
{"name": "powder", "quantity": 51}
],
"Barcelona": {
"Branch 1": [
{"name": "pencil", "quantity": 11},
{"name": "cam", "quantity": 25}
],
"Branch 2": [
{"name": "pencil", "quantity": 17},
{"name": "cam", "quantity": 9}
]
},
"Seville": {
"Branch 1": {
"Sub Branch 1": {
"Sub sub Branch 1": [
{"name": "powder", "quantity": 11}
]
}
},
"Branch 2": [
{"name": "pencil", "quantity": 4}
]
}
}
我搜索并写了很多代码,这是最有意义的一个
def recursive_sum(n):
current_sum = 0
for key in n:
if not isinstance(n[key], dict):
if not isinstance(n[key], str):
current_sum = current_sum + n[key]
else:
current_sum = current_sum + recursive_sum(n[key])
return current_sum
print(recursive_sum(Storage))
但是它返回这个:
Traceback (most recent call last):
File "/Users/user/Desktop/pythonProject/main.py", line 85, in <module>
print(recursive_sum(Storage))
File "/Users/user/Desktop/pythonProject/main.py", line 79, in recursive_sum
current_sum = current_sum + n[key]
TypeError: unsupported operand type(s) for +: 'int' and 'list'
我搜索了很多,但我似乎无法理解我将如何采取字典内列表的值,我想错了吗?提前感谢!
我发现这里有两个地方出了问题:
- 您从不检查类型"list",您需要遍历
- 在列表上迭代之后,您将再次获得字典,需要从中提取"数量"。
我将以不同的方式处理它:创建一个空输出字典。然后深入研究源代码(在您这样做的时候大致迭代),并检查是否"数量";键存在于当前级别中。然后检查对应的键是否存在,并将数量添加到结果字典中。
你的函数在到达这里时失败
if not isinstance(n[key], str):
current_sum = current_sum + n[key]
和n[key]是:
[{'name': 'pencil', 'quantity': 5}, {'name': 'cam', 'quantity': 11}, {'name': 'powder', 'quantity': 51}]
这可以通过一个简单的循环
来修复def recursive_sum(n):
current_sum = 0
for key in n:
if not isinstance(n[key], dict):
if not isinstance(n[key], str):
for i in n[key]:
current_sum = current_sum + i["quantity"]
else:
current_sum = current_sum + recursive_sum(n[key])
return current_sum