[英]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
),然后檢查它們是否以“id”開頭(使用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']
首先,您需要訪問 dict 的值,然后訪問該值的鍵
new_dict=[id for i in my_dict.values() for id in i.keys()]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.