Python 3.x 如何从Python中任意长度的嵌套字典中获取密钥
我有一个python中的dictionary对象。让我们把它叫做Python 3.x 如何从Python中任意长度的嵌套字典中获取密钥,python-3.x,recursion,dictionary,nested,Python 3.x,Recursion,Dictionary,Nested,我有一个python中的dictionary对象。让我们把它叫做dict。此对象可能包含另一个字典,而另一个字典又可能包含另一个字典,依此类推 dict = { 'k': v, 'k1': v1, 'dict2':{'k3': v3, 'k4':v4} , 'dict3':{'k5':v5, dict4:{'k6':v6}}} 这只是一个例子。最外层字典的长度可以是任意长度。我希望通过以下两种方式从此类dictionary对象中提取密钥: 获取仅包含密钥的列表 [k,k1,k2,k3
dict
。此对象可能包含另一个字典,而另一个字典又可能包含另一个字典,依此类推
dict = { 'k': v, 'k1': v1, 'dict2':{'k3': v3, 'k4':v4} , 'dict3':{'k5':v5, dict4:{'k6':v6}}}
这只是一个例子。最外层字典的长度可以是任意长度。我希望通过以下两种方式从此类dictionary对象中提取密钥:
[k,k1,k2,k3,k4,k5,k6]
outer_dict_keys = [k ,dict2, dict3]
dict2_keys = [k3,k4]
dict3_keys = [k5, dict4]
dict4_keys = [k6]
dict
长度总是在变化,所以我不能硬编码任何东西
实现上述结果的最佳方法是什么?混合使用迭代和尾部递归。在引用未定义的名称、统一间距并从第一个结果中删除“k2”之后,我产生了下面的代码。(为3.4编写和测试,它应该在任何3.x上运行,可能在2.7上运行。)需要记住的一点是,DICT的迭代顺序基本上是随机的,并且随每次运行而变化。这里所做的递归是深度优先访问子目录,而不是广度优先访问子目录。对于dict0,两者都是相同的,但是如果dict4嵌套在dict2而不是dict3中,它们就不会是相同的
dict0 = {'k0': 0, 'k1': 1, 'dict2':{'k3': 3, 'k4': 4},
'dict3':{'k5': 5, 'dict4':{'k6': 6}}}
def keys(dic, klist=[]):
subdics = []
for key in sorted(dic):
val = dic[key]
if isinstance(val, dict):
subdics.append(val)
else:
klist.append(key)
for subdict in subdics:
keys(subdict, klist)
return klist
result = keys(dict0)
print(result, '\n', result == ['k0','k1','k3','k4','k5','k6'])
def keylines(dic, name='outer_dict', lines=[]):
vals = []
subdics = []
for key in sorted(dic):
val = dic[key]
if isinstance(val, dict):
subdics.append((key,val))
else:
vals.append(key)
vals.extend(pair[0] for pair in subdics)
lines.append('{}_keys = {}'.format(name, vals))
for subdict in subdics:
keylines(subdict[1], subdict[0], lines)
return lines
result = keylines(dict0)
for line in result:
print(line,)
print()
expect = [
"outer_dict_keys = ['k0', 'k1', 'dict2', 'dict3']",
"dict2_keys = ['k3', 'k4']",
"dict3_keys = ['k5', 'dict4']",
"dict4_keys = ['k6']"]
for actual, want in zip(result, expect):
if actual != want:
print(want)
for i, (c1, c2) in enumerate(zip(actual, want)):
if c1 != c2:
print(i, c1, c2)
这太棒了。谢谢你,特里!