繁体   English   中英

从列表中解压缩dict,其中key不为None

[英]Unpack dict from list where key is not None

尝试从list解压缩非Nonedict

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

尝试了dict理解

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'}

正确的语法是什么?

您正在尝试将字典或“ 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'}

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

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

使用内置的函数filter

假设您确实有一个字典列表或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)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM