从键不是 None 的列表中解压字典
Unpack dict from list where key is not None
正在尝试从 list
中解压 dict
而非 None
:
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'}
正确的语法是什么?
您正在尝试将字典或 None
解包为两个变量(key
和 value
)。您不能以这种方式解压 或键入 。 None
不可迭代,对字典的迭代将产生 仅键 ,而不是值。
如果有字典则循环字典项,否则循环空序列,并解压迭代结果:
{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
来做到这一点,我认为这是非常可读的:
>>> 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)}
正在尝试从 list
中解压 dict
而非 None
:
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'}
正确的语法是什么?
您正在尝试将字典或 None
解包为两个变量(key
和 value
)。您不能以这种方式解压 或键入 。 None
不可迭代,对字典的迭代将产生 仅键 ,而不是值。
如果有字典则循环字典项,否则循环空序列,并解压迭代结果:
{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
来做到这一点,我认为这是非常可读的:
>>> 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)}