【问题标题】:Unpack dict from list where key is not None从 key 不是 None 的列表中解压 dict
【发布时间】:2017-06-05 13:20:17
【问题描述】:

尝试从list 中解压不是Nonedicts:

In [4]: unpack_dict = [{'key': 'a'}, {'key_2': 'b'}, None]

尝试了听写理解

In [5]: {key: value for (key, value) in unpack_dict if (key, value) is not None}
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-ec0e44b95586> in <module>()
----> 1 {key: value for (key, value) in unpack_dict if (key, value) is not None}

<ipython-input-5-ec0e44b95586> in <dictcomp>(.0)
----> 1 {key: value for (key, value) in unpack_dict if (key, value) is not None}

ValueError: not enough values to unpack (expected 2, got 1)

还有一个列表理解:

In [6]: {**[x for x in [unpack_dict] if x is not None]}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-ac36898d39a1> in <module>()
----> 1 {**[x for x in [unpack_dict] if x is not None]}

TypeError: 'list' object is not a mapping

预期结果:

{'key': 'a', 'key_2': 'b'}

什么是正确的语法?

【问题讨论】:

    标签: python dictionary list-comprehension dictionary-comprehension


    【解决方案1】:

    您正在尝试将字典或 None 解压缩为两个变量(keyvalue)。您不能以这种方式解压任何一种类型None 不可迭代,对 dict 的迭代将产生只产生键,而不产生值。

    如果有字典,则循环遍历字典项,否则循环空序列,并解包迭代结果

    {key: value for d in unpack_dict for key, value in (d.items() if d else ())}
    

    d.items() if d else () 表达式从(非空)字典中生成可迭代的 (key, value) 对,或空元组(导致嵌套迭代立即停止)。

    演示:

    >>> unpack_dict = [{'key': 'a'}, {'key_2': 'b'}, None]
    >>> {key: value for d in unpack_dict for key, value in (d.items() if d else ())}
    {'key': 'a', 'key_2': 'b'}
    

    【讨论】:

      【解决方案2】:

      FWIW,您可以通过for 循环和对dict.update 的连续调用来做到这一点,我认为这很容易阅读:

      >>> dct = {}
      >>> for d in unpack_dict:
      ...    if d:
      ...       dct.update(d)
      ... 
      >>> dct
      {'key': 'a', 'key_2': 'b'}
      

      【讨论】:

        【解决方案3】:

        使用内置函数filter

        根据您的示例,假设您确实有一个 dicts 或 None 列表:

        merged_dict = {}
        for dict in filter(None, unpack_dict):
            merged_dict.update(dict)
        

        或者在一行中:

        dict(pair for dict in filter(None, unpack_dict) for pair in dict.items())
        

        或者,如果您的输入应该是 元组 的列表,那么这很容易,并且与您尝试的类似:

        unpack_dict = [('key': 'a'), ('key_2': 'b'), None]
        {key: value for (key, value) in filter(None, unpack_dict)}
        

        【讨论】:

          猜你喜欢
          • 2022-09-25
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多