2012-03-26 10 views
113

可能性の重複:
What are “named tuples” in Python?辞書の代わりにいつnamedtupleを使うべきですか?

namedtupleを使用しなければならない状況とは何ですか?

私はそれを調べると、タプルを辞書のようにする方法のように見えました。彼らは辞書とどのように比較されますか?

名前付きタプルには辞書のハッシュ可能な型だけを使用できますか?

+0

この質問を見る - http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python – ronakg

+0

これは[上記の質問](https:///stackoverflow.com/questions/2970608/what-are-named-tuples-in-python)。 2つは相補的です。 – Dennis

答えて

156

dictでは、キーだけが値ではなくハッシュ可能でなければなりません。 namedtupleにはキーがないので、ハッシュの可能性は問題になりません。

しかし、それらはより厳しい制限を持っています - それらのキー同等物 "フィールド名"は文字列でなければなりません。基本的には

、あなたのようなクラスのインスタンスの束を作成するつもりだった場合:あなたが__init__でそれらを設定した後

class Container: 
    def __init__(self, name, date, foo, bar): 
     self.name = name 
     self.date = date 
     self.foo = foo 
     self.bar = bar 

mycontainer = Container(name, date, foo, bar) 

属性を変更しないで、あなたの代わりに

Container = namedtuple('Container', ['name', 'date', 'foo', 'bar']) 

mycontainer = Container(name, date, foo, bar) 
を使用することができます

を置き換えてください。

もちろん

、あなたが各1で同じキーを使用dict Sの束を作成することもできますが、あなたはキーとしてのみ有効なPython識別子を持つことになりますし、可変性を必要としないと仮定すると、

mynamedtuple.fieldname 

きれいより

mydict['fieldname'] 

mynamedtuple = MyNamedTuple(firstvalue, secondvalue) 

がきれいです

mydict = {'fieldname': firstvalue, 'secondfield': secondvalue} 

よりも最後に、namedtuple Sは、正規dictのとは違って、注文されているので、あなたは、あなたがdictとは異なり、フィールドを定義された順序でアイテムを取得します。

+16

Raymondhの引用: "名前付きタプルのインスタンスは通常のタプルよりもスペースを使いません。フィールド名のプロパティは名前付きタプルクラスに格納されています。" https:// twitter。com/raymondh/status/524660721968107521 – Moberg

+0

もう1つ注目すべきは、名前付きタプルも 'mynamedtuple = MyNamedTuple(fieldname = firstvalue、secondfield = secondvalue)'として初期化できるということです。 –

26

タプルは名前の有無にかかわらず変更できません。 namedtupleでは、インデックスの代わりに名前を使用するだけで、アクセスがより便利になります。有効な識別子はnamedtupleにしか使用できません。ハッシングは実行されません。代わりに新しいタイプが生成されます。

関連する問題