如何获取嵌套字典、列表和字典中所有键和值?

11
{'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

也许这个链接可以帮到你? - Hindol
你尝试过什么?给我们展示一些代码。 - Vikas
为了完全通用,您应该使用else:而不是elif isinstance(value, str): - huon
2
这里有一个问题:如果您有具有相同键的嵌套条目,则它们将彼此覆盖。希望这不是问题,但您应该意识到这一点。 - Jeff Tratner
已知问题。我的目的不是添加到字典中,而只是在每个键+值上运行函数,然后更新字典本身。 - eligro
3个回答

9
你可能想使用递归函数来提取所有的键、值对。
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++,所以需要通过Google查找所有语法。


1
最好将行elif isinstance(value, unicode):替换为else: - SparkAndShine
@sparkandshine 在我看来,显式优于隐式。isinstance 部分也可以作为文档说明。 - Hindol
1
在列表中并不真正起作用(即使在作者的示例中也是如此),是吗?还需要遍历列表。 - antonavy
1
Python 3 将 dict.iteritems 重命名为 dict.items。 - amin saffar

3

我从此链接稍作修改,以获取包含多个字典和嵌套字典的列表的所有键和值:

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')

0

虽然有点晚了,但对于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))

get_all_items() 的定义是什么? - Addison Klinke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接