从嵌套字典中获取键而不使用 for 循环

Getting keys from nested dictionary without using for loops

我的问题: 我有一个嵌套字典,如下所示:

my_dict = {
    'type_1' : {
        'id1' : some_item,
        'id2' : some_item_2,
    },
    'type_2' :{
        'id3' : some_item3,
        'id4' : some_item4,
    }
}

我不打算在这些 sub_dicts 中添加更多嵌套,所以我认为这应该相当容易。

现在我想得到所有在一个列表中的所有内部键(以'id'开头的所有内容),
这样我就得到 ['id1', 'id2', 'id3', 'id4]

简单的方法是使用两个 for 循环,但我希望它尽可能简洁。

我最初的方法是这样的:
all_keys = [list(sub_dict.keys()) for sub_dict in my_dict.values()] 输出
[['id1', 'id2'], ['id3', 'id4']] 这是我想要到达的地方的一半。 在 list(sub_dict(keys)) 前添加星号会引发语法错误:
“可迭代拆包不能用于理解”

知道我如何在一个未嵌套的列表中获取所有 'id' 字符串,最多增加一行代码吗?

您需要解开嵌套字典的键,如下:

res = [key for d in my_dict.values() for key in d.keys() if isinstance(key, str) and key.startswith("id")]
print(res)

输出

['id1', 'id2', 'id3', 'id4']

此外,您需要检查键是否实际上是字符串(使用 isinstance) and then check if they start with "id" (using startswith)。

作为替代使用 chain.from_iterable:

res = [key for key in chain.from_iterable(my_dict.values()) if isinstance(key, str) and key.startswith("id")]
print(res)

另外,正如@user2390182 所建议的,您不需要在嵌套词典上使用 .keys(),只需执行以下操作:

res = [key for sub_dict in my_dict.values() for key in sub_dict if isinstance(key, str) and key.startswith("id")]

您的解决方案没问题,您可以使用 itertools.chain 更正此问题,如下所示:

>>> from itertools import chain
>>> list(chain.from_iterable(sub_dict for sub_dict in my_dict.values()))
['id1', 'id2', 'id3', 'id4']

感谢@user2390182 短路方法:

>>> list(chain.from_iterable(my_dict.values()))
# Or
>>> [*chain(*map(chain, my_dict.values()))]
['id1', 'id2', 'id3', 'id4']

首先您需要访问字典的值,然后是该值的键

new_dict=[id for i in my_dict.values() for id in i.keys()]