Python迭代巢dicts内的bug

时间:2015-02-10 18:23:14

标签: python dictionary iterator

我尝试为CHECKIO编写扁平代码,结果很奇怪。 当我试图在dict里面的dict里面弄掉dict时。

def flatten(dic, prefix =""):
    results = {}
    for k in dic:
        prefix = prefix+"/"+k if prefix else k
        print(prefix)
        if isinstance(dic[k], dict):
            results = dict(list(results.items()) + list(flatten(dic[k],prefix).items()))
        else:
            results[prefix] = dic[k]
    return results
print(flatten({"name": {
                        "first": "One",
                        "last": "Drone"},
                    "job": "scout",
                    "recent": {},
                    "additional": {
                        "place": {

                            "zone": "1",
                            "cell": "2"}}}))

似乎代码在dict中跳转而没有首先使用dict中的第一项(name)进行迭代。 当我尝试在主dict上使用keys()时,我会得到内部项目。谁知道为什么?据我所知,它不应该发生。

谢谢

1 个答案:

答案 0 :(得分:1)

prefix==""开始,

prefix = prefix+"/"+k if prefix else k

仅适用于第一个键。在下一次迭代中,prefix不再是"",因此函数启动" stockpiling"钥匙在彼此之上。

使用另一个变量作为组合前缀,并且永远不会覆盖参数中的值。

更新:关于结果中条目的顺序。您的示例dict基本上如下所示:

{   "name": {
        "first": "One",
        "last": "Drone"},
    "job": "scout",
    "recent": {},
    "additional": {
        "place": {
            "zone": "1",
            "cell": "2"
        }
    }
}

因此,最外面的flatten调用将以一些未定义的顺序迭代顶级键 - namejobrecentadditional