从嵌套字典中获取键而不使用 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()]
我的问题: 我有一个嵌套字典,如下所示:
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()]