如何在python 3.6.3中以相反的顺序打印嵌套字典的值

时间:2018-01-04 19:06:03

标签: python string dictionary

我想以相反的顺序打印嵌套字典的值作为字符串,例如给定字典

M = {
  'data': 'k',
  'list': {
     'data': 'c',
     'list' : {
        'data': 'i',
        'list' : {
           'data': 's',
           'list':False
        }
     }
  }
}    

应输出

String = "sick"

5 个答案:

答案 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