python - Python递归函数从dict中获取数据
问题描述
我创建了一个递归函数来从字典中获取数据。字典由键组成,每个键都有一个键列表,并且继续下去。因此,当我输入键时,我需要获取键的展平列表。
我的字典:
data = {"p": ["s1", "s2", "s3", "s4"],
"s1": ["s1s1", "s1s2"],
"s2": [],
"s3": [],
"s4": [],
"s1s1": [],
"s1s2": ["s1s2s1"],
"s1s2s1": []
}
我的功能:
def get_data(key):
items = data[key]
if items:
for key in items:
items += get_data(key)
return items
当我打电话时get_data("p")
它返回
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1', 's1s2s1']
但预期的输出是:
['s1', 's2', 's3', 's4', 's1s1', 's1s2', 's1s2s1']
在此先感谢您的帮助...
解决方案
问题在于这些方面 -
for key in items:
items += get_data(key)
在这里,您在迭代项目时正在修改项目。因此,在最后一次迭代中,您items
最终会多次使用相同的密钥;您可以添加一个日志语句来查看正在使用哪个键来调用get_data
.
您想单独获取所有新项目,然后在迭代完成后更新项目 -
new_items = []
for key in items:
new_items += get_data(key)
items += new_items
推荐阅读
- elasticsearch - 将嵌套的数据存储在 Elastic Search 中以便在 Kibana 中进行分析是否更好?
- spring - Spring Data Redis 事务支持
- html - Bootstrap 将表单修复到页面底部
- azure - 数据工厂自托管集成运行时非活动节点
- javascript - ADF数据警告回答后如何强制回滚
- selenium-webdriver - Robot 中的 if 语句
- asp.net-core - 带有登录的 JMteter 线程组运行一次并使用 AccessToken 运行具有更多用户/线程的其他 HTTP 请求
- r - 根据列的唯一值从一个数据框创建数据框列表
- string - 从字符串中删除“k”个连续相同的字符,直到字符串没有任何连续的字符
- python - 在文本小部件中敲击“BackSpace”后,如何获得正确的 INSERT 值?