【问题标题】:how to print the values of a nested dictionary in reverse order in python 3.6.3如何在python 3.6.3中以相反的顺序打印嵌套字典的值
【发布时间】:2018-06-14 13:51:06
【问题描述】:

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

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

应该输出

String = "sick"

【问题讨论】:

  • 你能证明自己任何努力解决这个问题吗?
  • 人们从哪里得到这些奇怪的格式数据?
  • 虽然名称中没有明确说明,但homework其实就是yourwork
  • 按正序构建字符串/列表然后反转它可能最有意义。
  • Python

标签: python string dictionary


【解决方案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

【讨论】:

    【解决方案2】:

    这是你要找的吗?

     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
    

    【讨论】:

      【解决方案3】:

      你可以使用递归:

      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】:

        这就是你想要的:

        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),然后加入列表的反转版本,输出正确的字符串。

        【讨论】:

          【解决方案5】:

          使用递归方法,

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-17
            • 2019-06-15
            • 1970-01-01
            • 2016-12-28
            • 1970-01-01
            • 1970-01-01
            • 2022-12-03
            • 1970-01-01
            相关资源
            最近更新 更多