python - 循环嵌套字典值
问题描述
我需要能够通过字典的深层嵌套属性进行广度优先循环。这让我成为了其中的一部分(https://stackoverflow.com/a/10756615/5932433),但结果不是我需要的。
给定以下数据结构:
data = {
"a": {
"c": 1,
"d": 3,
},
"b": {
"e": 2,
"f": 4,
}
}
我需要一个返回以下内容的方法:
for _, v in cycle(tree_iter(data)):
print v
# 1 (a -> c)
# 2 (b -> e)
# 3 (a -> d)
# 4 (b -> f)
# 1
# 2
# 3
# 4
# ...etc...
这是我现在的方法tree_iter
:
def tree_iter(nested):
for key, value in nested.iteritems():
if isinstance(value, Mapping):
for inner_key, inner_value in tree_iter(value):
yield inner_key, inner_value
else:
yield key, value
请注意,顺序不需要保证,只要它是一致的。每次迭代都应该循环通过 a/b,然后循环通过嵌套值。
解决方案
您当前的代码似乎执行 DFS,因此您可以从 DFS 返回列表列表,压缩它们,然后展平。不是最优雅的,但它应该可以工作。
def tree_iter_dfs(nested):
for key, value in nested.iteritems():
if isinstance(value, Mapping):
yield value.items()
else:
yield [(key, value)]
# https://stackoverflow.com/a/952952/5309823
def flatten(l):
return [item for sublist in l for item in sublist]
def tree_iter_bfs(nested):
dfs = tree_iter_dfs(nested)
return flatten(zip(*dfs))
print(list(tree_iter_bfs(data)))
# [('c', 1), ('e', 2), ('d', 3), ('f', 4)]
根据需要将事物更改为可迭代;我不知道您使用的是什么版本的 Python,等等。
推荐阅读
- scrapy - 从多个 start_url 顺序抓取导致解析错误
- arduino - Arduino 模拟灵敏度 LDR 灵敏度到 MIC 灵敏度
- javascript - JavaScript:如何将音频 blob 拆分为 1 秒的块并使用 recorder.js 导出到 wav 文件?
- c# - 合并两个对象列表,但根据不同的值删除重复项
- html - 如何在 mat-autocomplete 中设置项目数
- javascript - 在 lodash 的油门装饰器上使用 flush
- reactjs - React:生产构建上的环境特定配置
- wpf - 如何在图表 WPF 应用程序上进行自动化 UI 测试
- r - 更改skim打印汇总函数的顺序
- linux - Linux Centos 问题上的 asp.net 核心 Web 应用程序主机