我发现自己经常制作多层次词典。我总是需要编写非常详细的代码,以使用大量临时变量遍历所有级别的字典
是否有一种方法可以将此函数概括为迭代多个级别,而不是硬编码并手动指定有多少个级别?
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)
这里有一个快速而肮脏的解决方案:
注意!!Python的递归限制约为1000!因此,在python中使用递归时,要非常仔细地考虑您要做什么,并准备好在调用这样的递归函数时捕获运行时错误
编辑: 通过评论,我意识到我犯了一个错误,没有将键添加到level1 dict输出,并且使用了可变结构作为默认参数。我在打印报表中添加了这些和参数,并重新发布。现在,输出与OP所需的输出相匹配,并使用更好、更现代的python
我是在看到@VoNWooDSoN的答案后写的。我把它变成了一个迭代器,而不是在函数内部打印,并做了一些修改,使它更具可读性。所以在这里看他的original answer
1-生产而不是印刷
2-
isinstance()
而不是type
,因此dict
的子类也可以工作。您还可以使用来自typing
模块的MutableMapping
而不是dict
使其更通用3-IMO,从
.items()
获取(k, v)
对比k
和d[k]
可读性强得多更通用
你想把它扩展到更一般的可以接受
考虑这些例子:depths
的数字以防万一吗输出:
^}不考虑深度(仍然像你希望的那样在第一位置工作)。但是现在通过指定从
0
到2
的深度,您可以看到我们可以迭代我们想要的深度。代码如下:试试这个代码
它还支持多个级别的组合
产出是:
使用递归是另一种方法,但我认为不使用递归的写作更具挑战性和效率:)
相关问题 更多 >
编程相关推荐