ホームページ >バックエンド開発 >Python チュートリアル >Pythonの名前付きタプルの使い方

Pythonの名前付きタプルの使い方

王林
王林転載
2023-05-02 23:13:051549ブラウズ

collections.namedtuple は、フィールド名を含むタプルを構築するために使用されます。対応する型は testing.NamedTuple (スーパークラスとして使用可能) です。

名前付きタプル

名前付きタプル オブジェクトの定義:

collections.namedtuple(typename, field_names,verbose=False, rename=False,defaults=None, module=None) :

  • typename: タプル名

  • field_names: フィールド シーケンス (例: [‘x’, ‘y’]) ;

  • rename: true の場合、フィールド名が無効な場合 (たとえば、同じ名前を持つ、またはキーワードを使用する) は、自動的に位置名 (たとえば、_1) に置き換えられます。 ;

  • defaults: フィールドのデフォルト値。反復可能なオブジェクトの場合、field_names のフィールドのデフォルト値に対応します。

from collections import namedtuple

Color = namedtuple("Color", "r g b alpha")

def convert_to_color(desc: str, alpha: float = 0.0):
    if desc == "green":
        return Color(r=50, g=205, b=50, alpha=alpha)
    elif desc == "blue":
        return Color(r=50, g=0, b=255, alpha=alpha)
    else:
        return Color(r=50, g=0, b=0, alpha=alpha)

反復可能オブジェクトから (Iterable) 名前付きタプルを構築します:

c = Color._make([10, 20, 30, 0.1])
nc = Color._make((10, 20, 30, 0.1))

print("r:", c.r)

タプル操作

名前付きタプルの変更: 内部の値は直接変更できず、新しい値を作成します。 _replace を通じて構築できます:

c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = c._replace(r=100)

辞書を名前付きタプルに変換します:

c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = Color(**c)

名前付きタプルを辞書に変換します (_asdict メソッド経由):

c = Color(r=50, g=0, b=0, alpha=0.5)
d = c._asdict()

Convert名前付きタプルからタプルへ:

c = Color(r=50, g=0, b=0, alpha=0.5)
t = tuple(c)

Attribute

  • Attribute_fields には、('r', 'g', 'b', など) のすべてのフィールドのタプルが含まれます。 'alpha');

  • 属性 __annotations__ には、フィールドと対応する型の辞書が含まれています。たとえば、{'r': e13446bebb88208a1ed1b67eb6c71d15、'g': 3cdc08f0c99a0b28cf50fa2b918827b4, 'b': 15fe1a1f411018ce39706d720ae2d2a8, 'alpha': e13446bebb88208a1ed1b67eb6c71d15};

  • Attribute_field_defaults はフィールドを保証します初期値と初期値の辞書を使用: { 'alpha': 0.0} など;

Sort

名前付きタプルの並べ替え: 並べ替えフィールドを指定できます。演算子ライブラリの attrgetter を介して:

from operator import attrgetter

colors = [
    Color(r=50, g=205, b=50, alpha=0.1),
    Color(r=50, g=205, b=50, alpha=0.5),
    Color(r=50, g=0, b=0, alpha=0.3)
]
out = sorted(colors, key=attrgetter("alpha"))
print(out)

with Dictionary 比較

Dictionary dict は、悪用されやすい非常に一般的なデータ構造ですが、同時に、namedtuple と比較して、次のような特徴があります。問題:

  • 辞書はハッシュ可能ではないため、セットや他の辞書に保存できません;

  • 辞書は変更可能であり、任意の数の辞書を作成できます。必要に応じて新しいキーを追加できます;

#dict と同様に、namedtuple では値を個々の変数に割り当て、必要に応じて使用できます。ただし:

namedtuple は不変であり、新しい値 (キー) が誤って追加されることはありません;

Data Class

データ クラスの詳細については、「Data」を参照してください。クラス(データクラス)の「はじめに」。

データクラスの変更

データ クラス (データ クラス) は python3.7 で導入されました。これは、「デフォルト値を持つ変数の名前付きタプル」と見なすことができます:

  • ドキュメントを簡単に追加できます;

  • オプションのフィールドを定義できます;

from dataclasses import dataclass

# frozen设为true后,字段内容将不允许修改(与namedtuple完全类似)
# 否则可修改字段;并可任意添加字段(如,c.n=1);
@dataclass(frozen=True)
class DColor:
    """A regular class that represents a color."""
    r: float
    g: float
    b: float
    alpha: float = 0.0

# c = DColor(r=10, g=20, b=30)
c = DColor(10, 20, 30)

NamedTuple の継承

継承によるNamedTuple も簡単に定義できます (同時にフィールドの初期値も定義でき、初期値を持つフィールドは初期値以外のフィールドの後に続く必要があります):

from typing import NamedTuple

class NColor(NamedTuple):
    """A namedtuple that represents a color."""
    r: float
    g: float
    b: float
    alpha: float = 0.0

nc = NColor(100, 110, 120)

以上がPythonの名前付きタプルの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。