循环嵌套字典值

时间:2019-03-26 00:21:13

标签: python algorithm iterator

我需要具有通过字典的深层嵌套属性进行广度优先循环的能力。这使我成为其中的一部分(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之间循环,然后在嵌套值之间循环。

1 个答案:

答案 0 :(得分:0)

您当前的代码似乎正在执行DFS,因此您可以从DFS返回列表列表,将其压缩,然后展平。不是最优雅的,但应该可以。

package baecompiler;
//boilerplate code https://github.com/bytedeco/javacpp-presets/tree/master/llvm
//so we can play with LLVM code generation
// General stuff
import org.bytedeco.javacpp.*;

// Headers required by LLVM
import static org.bytedeco.javacpp.LLVM.*;

public class LLVMExperiment {

    public static void main (String[] args) {

        BytePointer error = new BytePointer((Pointer)null); // Used to retrieve messages from functions

        LLVMLinkInMCJIT(); //the line it fails on

        ....

根据需要将事物更改为可迭代;我不知道您使用的是哪个版本的Python,等等。