我尝试为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()
时,我会得到内部项目。谁知道为什么?据我所知,它不应该发生。
谢谢
答案 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
调用将以一些未定义的顺序迭代顶级键 - name
,job
,recent
和additional
。