What is the simple way to merge named tuples in Python?

Senthil Babu picture Senthil Babu · Aug 28, 2012 · Viewed 8.5k times · Source

I want to merge two namedtuples without loosing the key names. If, I just do a merge with '+' operator I am getting a tuple as a result but without the names.

For instance:

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)

As you can see in the above case, the result of a + b has no names associated with them.

But, I am able to achieve it by creating a third namedtuple, which has fields from both A and 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)

Is this the right way or is there a better way to do this?

Answer

Simeon Visser picture Simeon Visser · Aug 28, 2012

Some observations:

  • In general Python would not know what to do when you try to merge two namedtuples that happen to have fields with the same name. Perhaps this is why there is no operator or function for this.

  • The documentation of _fields says:

Tuple of strings listing the field names. Useful for introspection and for creating new named tuple types from existing named tuples.

This suggests your approach is fine and perhaps even hinted at by the authors of the namedtuple code.