1. ホーム
  2. python

[解決済み] 名前付きタプルを辞書に変換する

2022-04-16 14:03:57

質問

Pythonで名前付きタプルのクラスを持っています。

class Town(collections.namedtuple('Town', [
    'name', 
    'population',
    'coordinates',
    'population', 
    'capital', 
    'state_bird'])):
    # ...

Townのインスタンスを辞書に変換したい。Townのフィールド名や数に厳密に縛られたくない。

フィールドを追加したり、全く別の名前のタプルを渡してディクショナリを取得するような書き方はないでしょうか。

元のクラス定義が他の人のコードに含まれているため、変更することができません。そこで、Townのインスタンスを取得して、辞書に変換する必要があります。

どのように解決するのですか?

TL;DR: 方法がある _asdict が用意されています。

ここでは、その使い方のデモを紹介します。

>>> fields = ['name', 'population', 'coordinates', 'capital', 'state_bird']
>>> Town = collections.namedtuple('Town', fields)
>>> funkytown = Town('funky', 300, 'somewhere', 'lipps', 'chicken')
>>> funkytown._asdict()
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])

これは 文書化されたメソッド は、名前付きタプルの、つまり、Pythonの通常の規約とは異なり メソッド名の頭にアンダースコアがついているのは、その使用を阻止するためではありません。 . namedtuplesに追加された他のメソッドと一緒に。 _make , _replace , _source , _fields この場合、フィールド名との衝突を避けるためにアンダースコアのみを使用します。


2.7.5 < Python version < 3.5.0 のコードで、このバージョンを目にすることがあるかもしれません。

>>> vars(funkytown)
OrderedDict([('name', 'funky'),
             ('population', 300),
             ('coordinates', 'somewhere'),
             ('capital', 'lipps'),
             ('state_bird', 'chicken')])

しばらくの間、ドキュメントに記載されていた _asdict は廃止されました ( ここで を使うことを提案し、ビルトインメソッドである バーズ . このアドバイスはもう古いものです。 バグ サブクラス化に関連する __dict__ プロパティが削除されました。 このコミット .