12

キー名を失うことなく、2 つの名前付きタプルをマージしたいと考えています。「+」演算子を使用してマージを実行すると、結果としてタプルが得られますが、名前はありません。

例えば:

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 の両方のフィールドを持つ 3 番目の名前付きタプルを作成することで、それを実現できます。

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)

これは正しい方法ですか、それともこれを行うためのより良い方法はありますか?

4

4 に答える 4

8

いくつかの観察:

  • 一般に、同じ名前のフィールドを持つ 2 つの名前付きタプルをマージしようとすると、Python は何をすべきかわかりません。おそらくこれが、このための演算子や関数がない理由です。

  • ドキュメントに_fieldsは次のように書かれています。

フィールド名をリストする文字列のタプル。イントロスペクションや、既存の名前付きタプルから新しい名前付きタプル タイプを作成する場合に便利です。

これは、あなたのアプローチが問題なく、おそらくnamedtupleコードの作成者によって示唆されていることを示唆しています.

于 2012-08-28T14:40:10.267 に答える
4

namedtuplePython は新しい、新しいクラスを自動的に作成しません。組み合わせを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)
于 2013-03-18T20:28:30.220 に答える
-4

いかがですか

>>> [a] + [b]
[A(a=10, b=20, c=30), B(d=40, e=50)]
于 2014-08-05T02:51:32.407 に答える