我想以相反的顺序打印嵌套字典的值作为字符串,例如给定字典
M = {
'data': 'k',
'list': {
'data': 'c',
'list' : {
'data': 'i',
'list' : {
'data': 's',
'list':False
}
}
}
}
应输出
String = "sick"
答案 0 :(得分:4)
使用递归方法,
def print_dict(d):
if not d:
return ''
return print_dict(d['list']) + d['data']
然后你可以打电话
M = {
'data': 'k',
'list': {
'data': 'c',
'list' : {
'data': 'i',
'list' : {
'data': 's',
'list': False
}
}
}
}
print print_dict(M)
并输出
sick
答案 1 :(得分:1)
这样做你想要的:
M ={'data': 'k', 'list':{
'data': 'c', 'list' : {
'data': 'i', 'list' : {
'data': 's', 'list':False}}}}
from collections import abc
def nested_dict_iter(nested):
for key, value in nested.items():
if isinstance(value, abc.Mapping):
yield from nested_dict_iter(value)
else:
yield value
print(''.join(reversed(list(nested_dict_iter(M))[:-1])))
输出:
sick
一些解释:
从this回答,dict是可迭代的,因此您可以将嵌套的容器可迭代公式应用于此问题。这允许您遍历嵌套字典,而yield
一次返回一个生成器。
由于字典是嵌套的,每个深度都有一个元素,因此顺序无关紧要。最后,我将生成器转换为列表,删除了最后一个元素(False
),然后加入了列表的反转版本,输出正确的字符串。
答案 2 :(得分:1)
这是一种非递归方法:
def get_data(d):
data = ''
while d:
data = d['data'] + data
d = d['list']
return data
print(get_data(M))
输出:
sick
算法很简单:从分配给嵌套字典的d
开始。在每个级别,收集d['data']
,然后深入到我们点击False
的下一级工具。
答案 3 :(得分:0)
您可以使用递归:
M ={'data': 'k', 'list':{
'data': 'c', 'list' : {
'data': 'i', 'list' : {
'data': 's', 'list':False}}}}
def flatten(s):
return [b if a == 'data' else (lambda x:None if not isinstance(x, dict) else flatten(x))(b) for a, b in s.items()]
def flatten_data(a):
if not isinstance(a, list):
yield a
else:
for i in a:
for b in flatten_data(i):
yield b
final_data = ''.join(filter(None, list(flatten_data(flatten(M)))))
输出:
sick
答案 4 :(得分:0)
这是你在找什么?
import json
M = {
'data': 'k',
'list': {
'data': 'c',
'list' : {
'data': 'i',
'list' : {
'data': 's',
'list':False
}
}
}
}
data=[]
def recursive_a(kl_1):
for i,j in kl_1.items():
if isinstance(j,dict):
recursive_a(j)
data.append(kl_1.get('data'))
return 0
print(recursive_a(json.loads(json.dumps(M))))
print("".join(data))
输出:
sick