【问题标题】:Cycling nested dictionary values循环嵌套字典值
【发布时间】:2019-03-26 00:21:13
【问题描述】:

我需要能够在字典的深层嵌套属性中进行广度优先循环。这让我获得了成功 (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,然后循环遍历嵌套值。

【问题讨论】:

  • 另外,dict的结构也会保持一致。所有值都在第 n 级。

标签: python algorithm iterator


【解决方案1】:

您当前的代码似乎在执行 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 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2022-06-15
    • 1970-01-01
    • 2020-09-13
    • 2021-05-30
    • 2021-07-16
    • 2018-07-13
    相关资源
    最近更新 更多