在Python中按排序顺序打印嵌套字典的键
我现在正在学习一点Python。我面临的首要任务之一是按排序顺序打印字典及其可能的嵌套字典的键 任务定义为: 编写一个程序以按排序顺序显示“字典字典”(嵌套字典)的所有键 所以我有点像在Python中按排序顺序打印嵌套字典的键,python,sorting,dictionary,Python,Sorting,Dictionary,我现在正在学习一点Python。我面临的首要任务之一是按排序顺序打印字典及其可能的嵌套字典的键 任务定义为: 编写一个程序以按排序顺序显示“字典字典”(嵌套字典)的所有键 所以我有点像 vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}} 并需要按排序顺序打印其所有键。 理论上,我不知道模块,所以我只能使用内置函数 在我看来,我能想到的唯一方法是使用vDict.keys()函数的输出,并使用正
vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}
并需要按排序顺序打印其所有键。
理论上,我不知道模块,所以我只能使用内置函数
在我看来,我能想到的唯一方法是使用vDict.keys()
函数的输出,并使用正则表达式进行拆分,以便对值进行排序。但是我不知道如何迭代第二层字典
我很确定这不是我应该在这里做的,还有一个更简单的方法。我很想看看受过教育的人是如何做到这一点的
这是在平静的工作时间自学,所以你没有在这里做我的作业;) 我想这就是你想要的:
vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}
def get_keys(vDict):
keys_list = []
for k in vDict.keys():
keys_list.append(k)
if(type(vDict[k]) is dict):
keys_list = keys_list + get_keys(vDict[k])
return keys_list
new_list = get_keys(vDict)
new_list.sort()
输出:
[1, 5, 20, 39, 49, 65, 124, 9298, 9359]
单行线方法
>>> sorted([k for v in vDict.values() if isinstance(v, dict) for k in v] + list(vDict))
[1, 5, 20, 39, 49, 65, 124, 9298, 9359]
分离出来的、可读性稍高的版本
>>> def iterate_keys(d):
... for k, v in d.items():
... yield k
... if isinstance(v, dict):
... yield from v
...
>>> sorted(iterate_keys(vDict))
[1, 5, 20, 39, 49, 65, 124, 9298, 9359]
如果您想处理嵌套更深的词典,可以将yield from v
行更改为yield from iterate_keys(v)
,以访问所有嵌套级别。这应该可以做到:
def process(dd, keys):
for key, val in dd.items():
keys.append(key)
if isinstance(val,dict):
process(val, keys)
return keys
vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}
keys=[]
process(vDict, keys)
print(sorted(keys))
提示:定义一个递归函数,该函数从给定的
dict
和用作值的任何dict
对象收集密钥。regex永远不是答案,永远只是最后的手段。谢谢。我给你的做了标记,因为在我看来这是最简单的方法。@kederrac,你读过评论了吗?没有必要让它比任务要求的更复杂。谢谢。只遍历字典的键值非常有意义,但我没有想到这是可能的,因为vDict.keys()的输出不干净。@Laghorn,您可以直接遍历字典,而不必使用.keys()
。在本例中,vDict:中的k的将起作用。