簡體   English   中英

從嵌套字典中獲取鍵而不使用 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 ),然后檢查它們是否以“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM