Python が名前をシーケンス (コード) の要素にマッピングする方法

不言
リリース: 2018-10-23 16:14:24
転載
2243 人が閲覧しました

この記事の内容は、Python が名前をシーケンス要素 (コード) にマッピングする方法に関するものであり、一定の参考価値があります。必要な友人が参照することができます。お役に立てば幸いです。

1. 要件

私たちのコードは位置 (インデックスまたは添え字) を介してリスト タプルにアクセスしますが、これによりコードが少し読みにくくなる場合があります。 。名前によって要素にアクセスできるようにして、構造内の位置への依存を減らしたいと考えています。

2. 解決策

通常のタプルと比較して、collections.namedtuple() (名前付きタプル) はこれらの利便性を提供するために追加するオーバーヘッドが非常に少ないだけです。実際、collections.namedtuple() は、Python の標準タプル型のサブクラスを返すファクトリ メソッドです。型名と対応するフィールドを指定すると、インスタンス化可能なクラスが返され、定義したフィールドの値などを渡します。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")
print(sub)
print(sub.addr)
print(sub.joined)
print(len(sub))
addr,joined=sub
print(addr)
print(joined)
#下面错误,以为你namedtuple是不可变的
#sub.joined="2019"
ログイン後にコピー

結果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
1782980833@qq.com
2018-10-23
2
1782980833@qq.com
2018-10-23
ログイン後にコピー

namedtuple のインスタンスは通常のクラス インスタンスのように見えますが、そのインスタンスは通常のタプルと交換可能であり、すべての通常のタプルがサポートされています。グループによってサポートされる操作。

名前付きタプルの主な機能は、コードを制御する要素の位置からコードを分離することです。したがって、データベース呼び出しからタプルの大きなリストを取得し、その位置によって要素にアクセスする場合、フォームに新しい列を追加するとコードはクラッシュしますが、返されたタプルが最初に名前付きタプルに変換される場合は、コードがクラッシュします。問題はありません。

この問題を説明するために、通常のタプルを使用したコードを次に示します:

def compute_cost(records):
    total=0.0
    for rec in records:
        total+=rec[1]*rec[2]
    return total
ログイン後にコピー

位置によって要素を参照すると、多くの場合、コードの表現力が低下し、レコードの構造の特異性に大きく依存します。

次は名前付きタプルを使用するバージョンです:

from collections import namedtuple
Stock=namedtuple('Stock',['name','shares','price'])
def compute_cost(records):
    total=0.0
    for rec in records:
        s=Stock(*rec)
        total+=s.shares*s.price
    return total
ログイン後にコピー

3. 分析

名前付きタプルの使用方法の 1 つは、辞書の代わりとして使用することです。後で、ユーザーはストレージ用にさらに多くのスペースを必要とします。したがって、大規模なデータ設計辞書を構築する場合は、namedtuple を使用する方が効率的ですが、辞書とは異なり、namedtuple は不変であることに注意してください。

属性を変更する必要がある場合は、namedtupleのinstance_replace()メソッドを使用して変更できます。このメソッドは、新しい名前付きタプルを作成し、対応する値を置き換えます。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")

print(sub)

sub=sub._replace(joined="2018-10-24")
print(sub)
ログイン後にコピー

結果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
Subsciber(addr='1782980833@qq.com', joined='2018-10-24')
ログイン後にコピー

__ replace() メソッドには微妙な使い方があり、名前付き要素にオプションのまたはフィールドが欠落しています。グループ。これを行うには、まずデフォルト値を含むプロトタイプ配列を作成し、次に _replace() メソッドを使用して新しいインスタンスを作成し、対応する値を置き換えます。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined','age'])
sub=Subscriber("",None,0)

def dict_to_stock(s):
    return sub._replace(**s)

a={"addr":"111111@qq.com","joined":"1111-11-11","age":11}
a=dict_to_stock(a)
print(a)

b={"addr":"111111@qq.com","joined":"1111-11-11"}
b=dict_to_stock(b)
print(b)
ログイン後にコピー

Result:

Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11)
Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)
ログイン後にコピー

最後に、非常に重要なことですが、目的が効率的なデータ構造を定義することであり、将来的にさまざまなインスタンス プロパティを変更する場合は、namedtuple を使用することに注意してください。代わりに、__slots__ 属性を使用するクラスを検討してください。

以上がPython が名前をシーケンス (コード) の要素にマッピングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート