我想合并两个namedtuples而不会丢失键名.如果,我只是与'+'运算符合并我得到一个元组作为结果但没有名称.
例如:
n [1]: from collections import namedtuple
In [2]: A = namedtuple("A", "a b c")
In [4]: B = namedtuple("B", "d e")
In [5]: a = A(10, 20, 30)
In [6]: b = B(40, 50)
In [7]: a + b
Out[7]: (10, 20, 30, 40, 50)
Run Code Online (Sandbox Code Playgroud)
正如您在上面的例子中所看到的,a + b的结果没有与之关联的名称.
但是,我能够通过创建第三个命名元组来实现它,它具有来自A和B的字段.
In [8]: C = namedtuple("C", A._fields + B._fields)
In [9]: C(*(a + b))
Out[9]: C(a=10, b=20, c=30, d=40, e=50)
Run Code Online (Sandbox Code Playgroud)
这是正确的方法还是有更好的方法来做到这一点?
就普通 Python 而言,您几乎已经掌握了它,但是如果您使用的是 Python 3.5+,则可以进行额外的简化。
>>> from collections import namedtuple
>>> A = namedtuple("A", "a b c")
>>> B = namedtuple("B", "d e")
>>> a = A(10, 20, 30)
>>> b = B(40, 50)
>>> C = namedtuple("C", A._fields + B._fields)
>>> C(*(a + b))
C(a=10, b=20, c=30, d=40, e=50)
>>> #Available in Python 3.5+
>>> C(*a, *b)
C(a=10, b=20, c=30, d=40, e=50)
Run Code Online (Sandbox Code Playgroud)
此外,如果您发现自己经常这样做,您可以使用以下函数来消除样板代码:
>>> from functools import reduce
>>> from itertools import chain
>>> from operator import add
>>> def namedtuplemerge(*args):
... cls = namedtuple('_'.join(arg.__class__.__name__ for arg in args), reduce(add, (arg._fields for arg in args)))
... return cls(*chain(*args))
...
>>> namedtuplemerge(a, b)
A_B(a=10, b=20, c=30, d=40, e=50)
Run Code Online (Sandbox Code Playgroud)