【发布时间】:2018-10-01 10:50:38
【问题描述】:
给定一些任意字典
mydict = {
'first': {
'second': {
'third': {
'fourth': 'the end'
}
}
}
}
在writing an answer到另一个问题的过程中,我写了一个小程序将其展平。
def recursive_flatten(mydict):
d = {}
for k, v in mydict.items():
if isinstance(v, dict):
for k2, v2 in recursive_flatten(v).items():
d[k + '.' + k2] = v2
else:
d[k] = v
return d
它有效,给了我想要的东西:
new_dict = recursive_flatten(mydict)
print(new_dict)
{'first.second.third.fourth': 'the end'}
并且应该适用于几乎任何任意结构的字典。不幸的是,它没有:
mydict['new_key'] = mydict
现在recursive_flatten(mydict) 将一直运行到堆栈空间用完为止。我试图弄清楚如何优雅地处理自引用(基本上,忽略或删除它们)。更复杂的是,任何子词典都可能发生自我引用……而不仅仅是顶层。我将如何优雅地处理自引用?我可以想到一个可变的默认参数,但应该有更好的方法......对吗?
感谢指点,感谢阅读。如果您有任何其他建议/改进,我欢迎recursive_flatten。
【问题讨论】:
-
一种方法是将您遇到的所有内容都放入字典中,并在进行过程中检查您以前从未见过的内容。另一种方法是保留两个指针,让其中一个走两步,另一个走一步。如果它们重合,你就有了一个循环。问题还在于您接下来要做什么 - 中止或返回明确定义的内容。
标签: python dictionary recursion