【问题标题】:Getting keys from nested dictionary without using for loops从嵌套字典中获取键而不使用 for 循环
【发布时间】:2021-12-07 10:12:47
【问题描述】:

我的问题: 我有一个看起来像这样的嵌套字典:

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”字符串,最多增加一行代码吗?

【问题讨论】:

    标签: python list dictionary nested list-comprehension


    【解决方案1】:

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

    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")]
    

    【讨论】:

      【解决方案2】:

      您的解决方案没问题,您可以使用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']
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-09-13
          • 1970-01-01
          • 2021-07-25
          • 2019-03-29
          • 1970-01-01
          • 2020-04-08
          • 1970-01-01
          • 1970-01-01
          • 2019-09-30
          相关资源
          最近更新 更多