【发布时间】:2021-09-30 01:45:05
【问题描述】:
我发现自己制作多级词典相当多。我总是必须编写非常冗长的代码来遍历具有大量临时变量的字典的所有级别。
有没有办法推广这个函数来迭代多个级别,而不是硬编码并手动指定有多少级别?
def iterate_multilevel_dictionary(d, number_of_levels):
# How to auto-detect number of levels?
# number_of_levels = 0
if number_of_levels == 1:
for k1, v1 in d.items():
yield k1, v1
if number_of_levels == 2:
for k1, v1 in d.items():
for k2, v2 in v1.items():
yield k1, k2, v2
if number_of_levels == 3:
for k1, v1 in d.items():
for k2, v2 in v1.items():
for k3, v3 in v2.items():
yield k1, k2, k3, v3
# Level 1
d_level1 = {"a":1,"b":2,"c":3}
for items in iterate_multilevel_dictionary(d_level1, number_of_levels=1):
print(items)
# ('a', 1)
# ('b', 2)
# ('c', 3)
# Level 2
d_level2 = {"group_1":{"a":1}, "group_2":{"b":2,"c":3}}
for items in iterate_multilevel_dictionary(d_level2, number_of_levels=2):
print(items)
#('group_1', 'a', 1)
#('group_2', 'b', 2)
#('group_2', 'c', 3)
# Level 3
d_level3 = {"collection_1":d_level2}
for items in iterate_multilevel_dictionary(d_level3, number_of_levels=3):
print(items)
# ('collection_1', 'group_1', 'a', 1)
# ('collection_1', 'group_2', 'b', 2)
# ('collection_1', 'group_2', 'c', 3)
【问题讨论】:
-
这是递归的罕见的强用例之一,因为嵌套的深度很少会导致堆栈问题。您是否尝试过递归方法?
-
不是临时的。一个典型的方法是将“当前级别”传递给递归函数,然后检查该层是否实际上是一个层,如果是,则将每个子片段传递给递归调用,否则,对该数据进行操作。这可能不会直接翻译成您在这里的确切情况,但是迭代递归结构(我认为会考虑嵌套字典)的答案通常是使用递归,所以这就是我在这里的想法。
-
喜欢this。同样,不是直接相关,但这是一种经常使用的模式,可能与您的问题相关。
标签: python function dictionary generator iterable