我想在不丢失键名的情况下合并两个命名元组。如果,我只是与'+'运算符合并,我得到一个元组作为结果,但没有名称。
例如:
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)
正如您在上面的例子中所看到的,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)
这是正确的方式还是有更好的方法来做到这一点?
答案 0 :(得分:5)
一些观察结果:
一般情况下,当您尝试合并两个碰巧具有相同名称字段的命名元组时,Python不知道该怎么做。也许这就是没有操作员或功能的原因。
列出字段名称的字符串元组。用于内省和从现有的命名元组创建新的命名元组类型。
这表明你的方法很好,甚至可能是由命名代码的作者暗示的。
答案 1 :(得分:3)
Python不会自动创建新的namedtuple
,这是一个新类。您必须自己定义合并的namedtuple
:
A = namedtuple("A", "a b c")
B = namedtuple("B", "d e")
AB = namedtuple("AB", "a b c d e")
a = A(1,2,3)
b = B(4,5)
ab = AB(*(a+b))
>>> a
A(a=1, b=2, c=3)
>>> b
B(d=4, e=5)
>>> ab
AB(a=1, b=2, c=3, d=4, e=5)
答案 2 :(得分:0)
就vanilla 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)
>>> C(*a, *b) #Available in Python 3.5
C(a=10, b=20, c=30, d=40, e=50)
此外,如果您经常这样做,可以使用此函数来消除样板代码:
>>> 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)
答案 3 :(得分:-3)
怎么做
>>> [a] + [b]
[A(a=10, b=20, c=30), B(d=40, e=50)]