用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。

假设有字典 x 和字典 y , BOSS 需要把他们合并,生成一个新的字典 z , x 和 y 保持不变。要实现的效果如下:

x = {'a': 1, 'b': 2}
y = {'b': 8, 'c': 9}

经过处理后

z = {'a': 1, 'b': 8, 'c': 9}

作为一个超级初学者,可能的做法是:

>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 8, 'c': 9}
>>> z = {}
>>> for k, v in x.items():
        z[k] = v
>>> for k, v in y.items():
        z[k] = v
>>> z
{'a': 1, 'b': 8, 'c': 9}

任务完成! 但是,这样的解法显然是不入孔乙己法眼的,于是开始数茴香豆。

茴香豆一: update

如果你的 Python 版本小于等于 3.4 ,那么如下方法应该是最常见的:

>>> z = x.copy()
>>> z.update(y)
>>> z
{'a': 1, 'b': 8, 'c': 9}

茴香豆二: 两个小星星

如果你已经完全抛弃了 2 ,并且 Python 版本已经大于等于 3.5 ,那么可以这样:

>>> z = {**x, **y}
>>> z
{'a': 1, 'b': 8, 'c': 9}

茴香豆三: 一条竖杠

什么?你的 Python 版本已经大于等于 3.9 了?好吧:

>>> z = x | y
>>> z
{'a': 1, 'b': 8, 'c': 9}

茴香豆四: ChainMap

ChainMap 可能对大多数开发者来说有点陌生,其特点是:“先入为主”,所以要注意两个字典的顺序。

>>> from collections import ChainMap
>>> z = dict(ChainMap(y, x))
>>> z
{'a': 1, 'b': 8, 'c': 9}

茴香豆五: Dict

Dict 是个好东西,下面是一些示例。但是,本人并不推荐使用。

为什么?不够优雅。

>>> z = dict(x, **y)  # 仅限于字典的 Key 均为 string 时有效
>>> z = dict(x.items() + y.items())  # Python 2
>>> z = dict(x.items() | y.items())