Python 访问嵌套字典中的键、值

Python 访问嵌套字典中的键、值,python,dictionary,Python,Dictionary,我知道以前有人问过关于访问嵌套字典中的键、值的问题,但我的以下代码有一些问题: 用于访问嵌套字典的键和值,如下所示: example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01'}, 'key_outer_02': {'key_inner_02': 'value_inner_02'}} 我有以下代码: def get_key_value_of_nested_dict(nested_dict):

我知道以前有人问过关于访问嵌套字典中的键、值的问题,但我的以下代码有一些问题:

用于访问嵌套字典的键和值,如下所示:

example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01'},
                'key_outer_02': {'key_inner_02': 'value_inner_02'}}
我有以下代码:

def get_key_value_of_nested_dict(nested_dict):
    for key, value in nested_dict.items():
        outer_key = None
        inner_key = None
        inner_value = None
        if isinstance(value, dict):
            outer_key = key
            get_key_value_of_nested_dict(value)
        else:
            inner_key = key
            inner_value = value
        return outer_key, inner_key, inner_value
我得到的结果是:

    key_outer_01 None None

我做错了什么

如果您有一个嵌套的
dict
,则需要一个嵌套的
for
循环:

def print_items(nested_dict):

    for key, dictionary in my_dict.items():

        for inner_key, value in dictionary.items():
            print(key, inner_key, value)

my_dict = {"a": {"b": "c", "d": "e"}, "f": {"g": "h"}}
print_items(my_dict)
这张照片是:

a b c
a d e
f g h

有一件事是肯定的,您需要在此处返回

if isinstance(value, dict):
        outer_key = key
        get_key_value_of_nested_dict(value)


在递归调用中,将外部_键内部_键内部_值设置为
。但是在
if-isintance(value,dict)
中,您只需将外键重新定义为
键。您可能需要分配
内部\u键
内部\u值
的新值

将新值分配给
内\u键
内\u值
!例如:

example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01'},
                'key_outer_02': {'key_inner_02': 'value_inner_02'}}

def get_key_value_of_nested_dict(nested_dict):
    for key, value in nested_dict.items():
        outer_key = None
        inner_key = None
        inner_value = None
        if isinstance(value, dict):
            outer_key = key
            _, inner_key, inner_value = get_key_value_of_nested_dict(value)
        else:
            inner_key = key
            inner_value = value
        return outer_key, inner_key, inner_value

print get_key_value_of_nested_dict(example_dict)
# outputs : ('key_outer_01', 'key_inner_01', 'value_inner_01')

我相信我们需要更多的信息,而所有的边缘案例都需要知道这个代码是好是坏


为了好玩,我尝试了一些改进,告诉我它是否比原始代码更适合您的情况

example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01', 'key_inner_02' : 'value_inner_02'},
                'key_outer_02': {'key_inner_02': 'value_inner_02'},
                'key_outer_03' : None}

def get_k_v_of_inner(nested_dict):
    for k, v in nested_dict.items():
        if isinstance(v, dict):
            for k_nested, v_nested in v.items():
                yield {k : {k_nested : v_nested}}
        else:
            # do_something, or simply ignore if not nested dict.
            pass

gen = get_k_v_of_inner(example_dict)

for c, value in enumerate(gen):
    print '#{} : {}'.format(c, value)

# outs : #0 : {'key_outer_01': {'key_inner_02': 'value_inner_02'}}
         #1 : {'key_outer_01': {'key_inner_01': 'value_inner_01'}}
         #2 : {'key_outer_02': {'key_inner_02': 'value_inner_02'}}
输出:

('key_outer_01', 'key_inner_01', 'value_inner_01')
你会得到一个元组列表。在每个元组中,第一个元素是键的列表,第二个元素是最终值

example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01'},
                'key_outer_02': {'key_inner_02': 'value_inner_02'}}

get_key_value_of_nested_dict(example_dict)

# output
[(['key_outer_01', 'key_inner_01'], 'value_inner_01'),
 (['key_outer_02', 'key_inner_02'], 'value_inner_02')]
要获得一个没有内部键列表的元组列表,只需稍微更改函数:

def get_key_value_of_nested_dict(nested_dict):
    rv = []
    for outer_key, value in nested_dict.items():
        try:
            inner_kvs = get_key_value_of_nested_dict(value)
            for i_kvs in inner_kvs:
                rv.append((outer_key,) + i_kvs)
        except AttributeError:
            rv.append((outer_key, value))
    return rv

get_key_value_of_nested_dict(example_dict)

# output
[('key_outer_01', 'key_inner_01', 'value_inner_01'),
 ('key_outer_02', 'key_inner_02', 'value_inner_02')]

您希望得到什么?您正在将内部_键和内部_值指定为None@Ev.Kounis:我希望每次迭代都能得到外键、内键和内值。@Harsha:是的,我认为我在那里的赋值有问题。我已经给出了答案,但我不满意。是否要在每次迭代中获取下一个
值\u inner
?您可能希望
产生
,而不是
返回
。这也非常有效。但是,您能解释一下第一个
if
块中需要
return
语句的原因吗?@ShamimAkhtar您对嵌套dict(value)
函数的
get\u key\u value\u的调用返回一个值。如果你想从你的函数中返回它的值,你需要返回一个
return
语句。在第一段代码中,为什么only('key\u outer\u 01','key\u inner\u 01','value\u inner\u 01')返回的是'key\u outer\u 02'呢?@Pradam我知道,我刚刚修复了OP的代码,但他想要什么还不清楚,尽管他似乎对我的安排很满意。我和你有同样的问题,因此我的第二个答案(依我看)是最好的答案。:)
def get_key_value_of_nested_dict(nested_dict):
    rv = []
    for outer_key, value in nested_dict.items():
        try:
            # first we leap
            inner_kvs = get_key_value_of_nested_dict(value)
            for inner_keys, inner_value in inner_kvs:
                rv.append(([outer_key]+inner_keys, inner_value))
        except AttributeError:
            # then ask for forgiveness
            rv.append(([outer_key], value))
    return rv
example_dict = {'key_outer_01': {'key_inner_01': 'value_inner_01'},
                'key_outer_02': {'key_inner_02': 'value_inner_02'}}

get_key_value_of_nested_dict(example_dict)

# output
[(['key_outer_01', 'key_inner_01'], 'value_inner_01'),
 (['key_outer_02', 'key_inner_02'], 'value_inner_02')]
def get_key_value_of_nested_dict(nested_dict):
    rv = []
    for outer_key, value in nested_dict.items():
        try:
            inner_kvs = get_key_value_of_nested_dict(value)
            for i_kvs in inner_kvs:
                rv.append((outer_key,) + i_kvs)
        except AttributeError:
            rv.append((outer_key, value))
    return rv

get_key_value_of_nested_dict(example_dict)

# output
[('key_outer_01', 'key_inner_01', 'value_inner_01'),
 ('key_outer_02', 'key_inner_02', 'value_inner_02')]