【问题标题】:how to get all keys&values in nested dict of list-of-dicts and dicts?如何获取字典列表和字典的嵌套字典中的所有键值?
【发布时间】:2012-05-21 03:05:51
【问题描述】:
{'action_name':'mobile signup',
    'functions':[{'name':'test_signUp',
                  'parameters':{'username':'max@getappcard.com',
                                'password':'12345',
                                'mobileLater':'123454231',
                                'mobile':'1e2w1e2w',
                                'card':'1232313',
                                'cardLater':'1234321234321'}}],
    'validations':[
            {'MOB_header':'My stores'},
            {'url':"/stores/my"}]}

我想把这个字典的所有键和值作为一个列表(在它们是字典或数组的值之外)

打印结果应该是这样的:

action name = mobile signup
name = test_signUp
username : max@getappcard.com
password : 12345
mobileLater: 123454231
mobile : 1e2w1e2w
card : 1232313 
cardLater : 1234321234321
MOB_header : My stores

【问题讨论】:

  • 也许this 会有所帮助?
  • 你试过什么?给我们看一些代码。
  • 为了全面起见,您应该使用else: 而不是elif isinstance(value, str):
  • 这里有一个问题:如果嵌套的条目具有相同的键,它们将相互覆盖。希望这不是问题,但您应该注意。
  • 已知问题。我的目的不是添加到 dict,而只是在每个 key+value 上运行函数,然后更新 dictIn 本身。

标签: python list dictionary


【解决方案1】:

您可能希望使用递归函数来提取所有 key, value 对。

def extract(dict_in, dict_out):
    for key, value in dict_in.iteritems():
        if isinstance(value, dict): # If value itself is dictionary
            extract(value, dict_out)
        elif isinstance(value, unicode):
            # Write to dict_out
            dict_out[key] = value
    return dict_out

类似的东西。我来自 C++ 背景,所以我不得不用谷歌搜索所有语法。

【讨论】:

  • 最好将elif isinstance(value, unicode): 替换为else:
  • @sparkandshine 恕我直言,显式优于隐式。 isinstance 部分也可用作文档。
  • 确实不适用于列表(即使在作者的示例中),是吗?也必须遍历列表。
  • Python 3 重命名 dict.iteritems -> dict.items.
【解决方案2】:

有点晚了,但是对于 python 3.8 你可以使用yield from

def dictitems2list(d):
    for k, v in d.items():
        yield k
        if isinstance(v, dict):
            yield from get_all_items(v)
        else:
            yield v

all_itemt = list(dict2items(d))

【讨论】:

    【解决方案3】:

    我对@9​​87654321@ 进行了一些修改,以获取字典列表和字典的嵌套字典中的所有键和值:

    def recursive_items(dictionary):
        for key, value in dictionary.items():
            if type(value) is dict:
                yield (key, value)
                yield from recursive_items(value)
            elif type(value) is list:
                yield (key, value)
                for i in value:
                    if type(i) is dict:
                        yield from recursive_items(i)
            else:
                yield (key, value)
    
    for i in recursive_items(your_dict):
        print(i) #print out tuple of (key, value)
    

    输出:

    ('action_name', 'mobile signup')
    ('functions', [{'name': 'test_signUp', 'parameters': {'username': 
    'max@getappcard.com', 'password': '12345', 'mobileLater': '123454231', 'mobile': 
    '1e2w1e2w', 'card': '1232313', 'cardLater': '1234321234321'}}])
    ('name', 'test_signUp')
    ('parameters', {'username': 'max@getappcard.com', 'password': '12345', 
    'mobileLater': '123454231', 'mobile': '1e2w1e2w', 'card': '1232313', 
    'cardLater': '1234321234321'})
    ('username', 'max@getappcard.com')
    ('password', '12345')
    ('mobileLater', '123454231')
    ('mobile', '1e2w1e2w')
    ('card', '1232313')
    ('cardLater', '1234321234321')
    ('validations', [{'MOB_header': 'My stores'}, {'url': '/stores/my'}])
    ('MOB_header', 'My stores')
    ('url', '/stores/my')
    

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2020-12-15
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多