Skip to content
This page has been auto-translated and may contain errors.View in English

タプルとセット

docs.scrimba.com

リストはご存じでしょう。Pythonには、リストでは解決できない問題を解く、2つのコレクション型があります。タプルは変わることのない値の固定グループを保持します。セットは一意の値だけを保持し、コレクションがどんなに大きくても、メンバーシップをすぐに確認できます。

Pythonのコレクション・ツールキットには4つのタイプがあります。リスト辞書は最も一般的なケースを処理します。タプルとセットは特定のケースを解決します:不変性が資産となる固定レコードと、O(1)のメンバーシップテストが優先される一意値コレクションです。

listdictの他に、Pythonはtuple(作成後に変更できない固定長シーケンス)とset(ハッシュテーブルの上に構築された順序なしの一意値コレクション、dictを高速にする同じ内容参照構造)を提供します。以下のすべての決定を左右する分割:タプルはハッシュ可能です(その内容は1つの数に縮小でき、辞書キーまたはセットメンバーとして機能できます)、リストはそうではありません。習慣で到達するのではなく、コレクションが何をする必要があるかに基づいて選択してください。

タプル

タプルは、作成後に変更できない順序付けされた値のグループです。括弧がタプルを定義しますが、オプションです。実際にタプルを作成するのはカンマです。単一項目のタプルは末尾のカンマが必要です。

タプルは不変シーケンスです。括弧ではなく、カンマがタプルを作成するものです。不変性により、すべての要素も不変な場合はハッシュ可能になり、リストが埋められない使用例が開かれます:辞書キー、セットメンバー、固定構造レコード。

tupleは、一度存在したら変更できない固定長シーケンスです。その中の何も動かないため、Pythonはそれに対して単一のハッシュ(その内容から導出される数)を計算できます。すべての要素自体がハッシュ可能な限り、タプルが辞書キーまたはセットメンバーとして機能することができます。リストはそうではありません。インデックスとスライスはリストとまったく同じように機能します。項目の割り当てはないので、point[0] = 99はその行が実行されるときTypeErrorを発生させます。単一項目の形式(42,)は末尾のカンマが必要です。それなしでは、括弧は単にグループ化されて、裸の値42を取得します。

python
point = (10, 20)
rgb = (255, 128, 0)
dimensions = (1920, 1080)
single = (42,)            # 単一項目タプルには末尾のカンマが必須
also_tuple = 42, 99       # 括弧はオプション;カンマがタプルを作成

インデックスでのアクセスはリストとまったく同じです。項目を変更しようとするとTypeErrorが発生します:

インデックス、スライス、負のインデックスはすべてリストと同じに機能します。インデックス経由での割り当ての試みはTypeErrorを発生させます;これは意図的であり、制限ではありません。

インデックス、負のインデックス、またはスライスによるタプルからの読み取りはリストとまったく同じように動作します。異なるのは書き込みです:項目割り当てがないため、point[0] = 99はその行が実行される瞬間にTypeErrorを発生させます。それがタプルをリストより選ぶ全体のポイントです。これはあなたとその後のすべての読み手が変わらないと信頼できる値です。

python
point = (10, 20)
point[0]    # 10
point[1]    # 20
point[-1]   # 20

point[0] = 99    # TypeError: 'tuple' object does not support item assignment
JunoTuples タプルは、作成後に変更できない順序付けされた値のグループです。カンマが作成するのは括弧ではなく、これが(42,)が孤立した末尾のカンマが必要な理由です。項目を再割り当てしようとすると、TypeErrorが発生します。その锁定-内感覚がまさにタプルを選ぶ理由です。
JunoTuples タプルは不変シーケンスであり、カンマがそれらを作成し、括弧ではありません。その不変性は機能です:その内容が不変な場合、タプルをハッシュ可能にするため、リストできない辞書キーまたはセットメンバーになることができます。項目割り当ては設計によりTypeErrorを発生させます。
JunoTuples タプルの読み取りはリストと一致します;書き込みはない、そのためpoint[0] = 99は実行時にTypeErrorを発生させます。それに頼ってください:タプルは、下流で何も再度書き込まないことを保証する必要があるとき、周りに渡す値です。単一項目の(42,)の罠はすべての人を一度つかみます。

タプルを使う場合

一緒に属する関連値の小さなグループを持っていて、変わることのないときにタプルを使用します。座標(x, y)、色(r, g, b)、名前スコアペア("太郎", 87)。固定構造は、コードを読む人にこのグループが単一ユニットとして扱われていることを知らせます。

タプルは固定構造を伝えます:位置が意味を持ち、グループが単一ユニットとして扱われる値のグループ。それらのハッシュ可能性は、リストができない辞書キーとして有効にします。タプルが伝えるコントラクトは:これらの値は一緒に属し、変わることを意図していません。

固定形状のレコードを持っているときにタプルに到達してください:既知の数のフィールドで、各位置が何か特定を意味します。タプルはハッシュ可能であるため(その内容は1つの数に縮小されます)、ハッシュ可能な値が必要な場所ならどこでもスロットイン:辞書キー、セットメンバー、または呼び出した引数をハッシュ化するメモ化の背後にあるfunctools.lru_cache。セマンティック信号も異なります。タプルは「これらのフィールドは一緒に属し、各位置が意味を持つ」(座標、色)と言い、リストは「長さが変わる可能性のある同様のものの実行」と言います。

Junoタプルを使う場合 各スポットが何か意味を持つ固定の小さなグループがあるときに、タプルに到達します:座標、(r, g, b)色、名前とスコアペア。タプルはハッシュ可能であるため、辞書キーとして使用することもできます。リストはそうではできず、最初に試みるとき人々を困らせます。
Junoタプルを使う場合 タプルは固定構造を知らせます:位置が意味を持ち、グループは単一ユニットとして移動します。これはリストとの違いで、「長さが変わる可能性のあるシーケンス」と言います。そしてタプルはハッシュ可能であるため、リストがTypeErrorを発生させる場所で辞書キーとして機能します。
Junoタプルを使う場合 固定形状レコード用のタプル、可変長の同様のものの実行用のリスト。利益はハッシュ可能性です:タプルは辞書キー、セット、またはlru_cacheキーにドロップされます、リストが行くことができないすべての場所。そのコントラクトをコメントの代わりに型に担わせましょう。
python
locations = {}
locations[(40, -74)] = "東京"   # 辞書キーとしてのタプル、機能
locations[[40, -74]] = "東京"   # 辞書キーとしてのリスト、TypeError

アンパッキング

アンパッキングはタプルから値を抽出し、1行で各値を独自の名前に割り当てます。名前の数は値の数と一致する必要があります。*を使用して、残りのアイテムを任意にリストにキャプチャします。

アンパッキングは任意のイテラブル上で機能します:タプル、リスト、文字列。ターゲット名の数はイテラブルの長さと一致する必要があります。スター付きターゲットが可変長スライスをキャッチする場合を除きます。不一致はValueErrorを発生させます。アンパッキングは、関数から複数の戻り値を消費するための慣例的な方法です。

アンパッキングは、タプルだけでなく、任意のイテラブル(ループできるもの)上で機能し、右側を移動して、各値を順序でターゲット名にバインドします。スター付きターゲット(*rest)は残りのアイテムをlistに浸し、その数がもはや正確に一致する必要がないようにします。プレーンな数のズレは実行時にValueErrorを発生させます。最もよく到達する形式はforヘッダーにあります:for name, score in pairsはループするときに各アイテムをアンパッキングし、各ペアを手でインデックスするよりもはるかにきれいに読みます。

Junoアンパッキング アンパッキングはタプルまたはリストから各値を抽出し、`x, y = point`のように1行で独自の名前を手渡します。名前の数は値の数と一致する必要があります。`*rest`を追加して、残っているものをすくいます。`point[0]`と`point[1]`を至るところに書き込むのをやめた日にそれは私をクリックしました。
Junoアンパッキング アンパッキングは各値を1行で独自の名前に割り当て、`*rest`のようなスター付きターゲットが可変長スライスをキャッチします。一致しない数は`ValueError`を発生させます。関数から複数の戻り値を取得する代わりに結果をインデックスする方法はきれいです。
Junoアンパッキング アンパッキングは任意のイテラブル上で実行され、左から右にバインドします;`*rest`は遊びを吸収し、プレーンな不一致は`ValueError`を発生させます。最もそれが報いられるスポットは`for`ヘッダー、`for name, score in pairs`で、各ペアをインデックスで到達するより優れています。
python
point = (10, 20)
x, y = point

print(x)   # 10
print(y)   # 20

first, *rest = [1, 2, 3, 4, 5]
# first = 1, rest = [2, 3, 4, 5]

head, *middle, tail = [1, 2, 3, 4, 5]
# head = 1, middle = [2, 3, 4], tail = 5

名前付きタプル

名前付きタプルは、各位置に名前を持つタプルです。point[0]がx座標であることを覚える代わりに、point.xと書きます。値はまだ不変です;数値位置の代わりに、読み取り可能な属性名を取得します。

namedtupleは、タプルのようにまったく動作しますが、命名された属性アクセスを追加するクラスを生成します。それは完全なクラスより軽く、不変で、自己ドキュメント化されています。プレーンなタプルの位置アクセスがコメントで理解されるのに必要なときに使用します。

collections.namedtupleクラスファクトリーです(ビルドして、あなたが使用する新しいクラスを手渡す関数)。返すクラスは、名前付きフィールドを持つtupleであり、プレーンなタプルと同じメモリコストでありながら、はるかにうまく読まれます。_asdict()(それを辞書に変える)、_replace()(1つのフィールドが変更されたコピーを作成し、それは変更できないため)、_fieldsは無料で取得します。より多くのもの、デフォルト値またはタイプ注釈が必要な場合、typing.NamedTupleは注釈付きケースをカバーし、メソッドまたはオプションの可変性が必要な場合はdataclasses.dataclassが最新の選択です。

Juno名前付きタプル 名前付きタプルはすべての位置に名前を付けるため、`point[0]`がx座標であることを覚える代わりに`point.x`と書きます。それはまだ完全に不変であり、すべての他の方法で通常のタプルのように動作します。コードを読むあなたの将来の自己は名前に感謝するでしょう。
Juno名前付きタプル `namedtuple`は、名前付き属性アクセスを持つタプルのようなクラスを構築し、不変で自己ドキュメント化された、完全なクラスより軽い。プレーンなタプルの位置がコメントで説明される必要があるすぐその瞬間に到達します。その過去、`dataclass`は最新のステップアップです。
Juno名前付きタプル `namedtuple`は、同じメモリコストで名前付きフィールドを持つタプルサブクラスを渡し、`_replace()`と`_asdict()`は無料です。デフォルト、メソッド、または実装のタイプヒントが必要な場合、ファクトリーと戦うのではなく`typing.NamedTuple`または`dataclass`にジャンプしてください。

namedtupleは標準ライブラリに存在するため、最初にインポートが必要です:from collections import namedtuple。インポートはモジュールの章で完全に扱われます。

python
from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
Player = namedtuple("Player", ["name", "score", "level"])

p = Point(10, 20)
p.x    # 10
p.y    # 20

alice = Player("太郎", 87, 5)
alice.name    # "太郎"
alice.score   # 87

セット

セットは、順序が保証されていない一意の値のコレクションです。同じ値を2回追加しても何もしません:セットは各アイテムのコピーを1つだけ保持します。セットをアイテムで使用するには中括弧を使用するか、set()を使用して空のセットを作成します。

setは、自動的に重複を拒否する順序なしのコレクション。メンバーシップテストはサイズに関係なくO(1)です。これは、大きなコレクション全体で値が存在するかどうかをチェックする必要があるときは、正しいツールになります。注意:{}は空の辞書を作成し、空のセットではありません;それにset()を使用してください。

setは一意でハッシュ可能な値を保持し、辞書と同じ構造をルックアップコンテンツとしてハッシュテーブルの上に構築されています。これは、O(1)の平均メンバーシップ、挿入、削除を獲得します(セットが成長するときコストは平坦のままで、サイズで登ることの代わりに)。計画の周り2つの結果:ハッシュ可能な値のみが中に入ることができるため、intstr、およびtupleは問題ありませんがlistdict、およびsetではなく、反復順序は内部ハッシュ位置に従うため、それが安定していることに決してに頼ってください。1つの構文トラップ:{}は空のセットではなく空の辞書です;set()を使用してください。

Junoセット セットは一意の値のみを保持するため、既にそこにあるものを追加すると、エラーもなく重複もなく何もしません。中括弧とアイテムを持つセットを構築しますが、空のセットにはset()に到達してください。`{}`は秘密の空の辞書だからです。最後のビットはほぼ全員をつかみます。
Junoセット セットは自動的に重複をドロップし、どんなに大きくても O(1) でメンバーシップをテストします。これは大きなコレクションで「これはここにあります?」に対して正しいツールになるものです。空のセット罠を見てください:`{}`は辞書なので、空のセットが欲しい場合は`set()`を使用します。
Junoセット セットはハッシュテーブルの一意のハッシュ可能な値:O(1)メンバーシップ、挿入、削除。ハッシュ可能なアイテムのみが中に入り、反復順序は安定していません。その順序に頼らないでください。空のセットが欲しいときは`{}`は辞書であることを覚えておき、`set()`に到達してください。
python
tags = {"python", "beginner", "tutorial"}
numbers = {1, 2, 3, 4, 5}
empty = set()    # {}ではなく(それは空の辞書)

同じ値を2回追加してもセットは変わりません:

python
tags.add("python")   # tagsは変わりません、"python"は既にそこにあります

セットを使う場合

セットは3つのことに対して正しいツールです:リストから重複を削除する、大きなコレクション全体で何かが存在するかどうかを素早くチェックする、2つのグループを比較して共有内容または相違点を見つける。

セット使用を駆動する3つの異なる使用例があります:重複削除(挿入時に自動)、O(1)メンバーシップテスト(リストの場合O(n)対比)、セット代数(|&-^)。コレクションが大きく、頻繁にメンバーシップをチェックすると、パフォーマンスの違いは重要です。

ハッシュテーブルから直接来る3つの使用例:一意性(挿入時に重複が拒否される)、O(1)メンバーシップ(セットが成長するときにinのコストは平坦のままで)、セット代数(|&-^)。メンバーシップテストは実装のコード内で報いられるもの:10,000アイテムのセットに対するinは10アイテムのセットと同じくらい高速です。リストに対する同じチェックはO(n)であり、線形で遅くなります。大きなリストに対して繰り返しx in some_listを行っている場合、一度リストをセットに変更することは通常ですの修正。

Junoセットを使う場合 3つの仕事セット素晴らしい:リストから重複を除去、大きなコレクションで何かが存在するかどうかを素早くチェック、2つのグループを比較してそれらが共有或いは異なるかどうかを見る。それらのいずれかが何をしているのかであれば、セットはおそらくツールです。
Junoセットを使う場合 3つのドライバー:挿入時の重複削除、リストに対するO(1)メンバーシップ対O(n)、`|`、`&`、`-`、`^`のセット代数。より大きなコレクションとより頻繁に`in`をチェック、セットはより引き出します。
Junoセットを使う場合 一意性、O(1)の`in`、ハッシュテーブルから落ちるセット代数。メンバーシップの勝利は実践的なもの:繰り返し`x in big_list`はO(n)毎回であるため、リストをセットに変更することはいつもの修正です。
python
# リストから重複を削除
raw = ["cat", "dog", "cat", "bird", "dog", "cat"]
unique = list(set(raw))   # ["cat", "dog", "bird"](順序は保証されていない)
python
# 高速メンバーシップチェック
valid_codes = {"USD", "EUR", "GBP", "JPY"}
code = "EUR"

if code in valid_codes:    # 即座ルックアップ、数千のコードの場合でも
    print("Valid")

セット操作

セットは数学で学んだ同じ操作をサポートします:和(どちらかのセットに含まれているすべて)、積(両方のセットが共有するもののみ)、差(1つが他にない含まれているもの)。Pythonはこれらに対してオペレータシンボルを使用し、各メソッドの等価を持ちます。

Pythonのセットオペレータは数学記号を反映:|は和、&は積、-は差、^は対称差。各オペレータはメソッド形式(.union().intersection()など)を持ち、セットのみでなく任意のイテラブルも受け入れます。

オペレータ形式(|&-^)は両側をセットのままにする必要があり、リストのような何か他の場合TypeErrorを発生させます。メソッド形式(.union().intersection())はよりルーズです:任意のイテラブルを受け入れ、あなたのためにそれを変換するため、a.union([1, 2])a | [1, 2]が失敗する場所で機能します。操作が爆発するときに覚える違いはそれです。また、インプレース形式(|=&=-=^=)は、新しいセットを返す代わりに左側のセットを更新する、.update().intersection_update()などを呼び出す同じです。

Junoセット操作 数学クラスから4つの操作:`|`は和(どちらかに含まれているもの)、`&`は積(両方に含まれているもの)、`-`は差(1つに含まれているが他に含まれていないもの)、`^`は対称差(1つに含まれているが両方ではないもの)。各々はまた`union()`のようなスペルアウトされたメソッドを持ちます。記号を引き出す場合は言葉を求めるなら。
Junoセット操作 `|`和、`&`積、`-`差、`^`対称差。メソッド形式(`.union()`と友人)は同じですが、セットのみでなく任意のイテラブルを受け入れるため、`a | [1, 2]`がしない場所で`a.union([1, 2])`が機能します。
Junoセット操作 オペレータはセットとして両側を必要としセット以外の場合`TypeError`を発生させます;メソッド形式はまたイテラブルを引き受けるため、`a.union([1, 2])`は`a | [1, 2]`が機能しない場所で機能します。インプレース形式(`|=`、`&=`)は新しいセットを返す代わりにインプレースで更新します。
python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a | b    # {1, 2, 3, 4, 5, 6}   (和:どちらかに含まれているすべて)
a & b    # {3, 4}               (積:両方に含まれているのみ)
a - b    # {1, 2}               (差:aに含まれているが b ではない)
b - a    # {5, 6}               (差反対方向)
a ^ b    # {1, 2, 5, 6}        (対称差:1つに含まれているが両方ではない)

これらはまたメソッド形式を持ちます:.union().intersection().difference().symmetric_difference()

セット修正

セットは可変です。.add()は1つのアイテムを追加します。.update()は任意のリストまたは他のイテラブルから一度に複数を追加します。.remove()はアイテムを削除しますがそこにない場合エラーを発生させます。.discard()はアイテムが存在する場合は静かに削除し、存在しない場合は何もしません。

.add()はO(1)平均。.update()は任意のイテラブルを受け入れ、ループで.add()を呼び出すのと同等です。.remove()はミス時にKeyErrorを発生させながら、.discard()は存在が不確かな場合は安全な選択。.pop()は「最後の」もの以外ではなく、任意の要素を削除します。セットには順序がないため。

.add(x)は1つのアイテムをO(1)平均で挿入します;.update(iterable)は多くを追加し、|=と同じです。人々を噛む対は.remove().discard():両方ともアイテムを削除しますが、.remove()はアイテムが不在でときにKeyErrorを発生させながら、.discard()は静かに何もしません。存在が不確かなときはいつ.discard()に到達して、不在アイテムが例外ではあなたが包む必要があります。.pop()は何か要素を返して削除しますが、どれかは定義されていません:セットに順序がないため、決してそれを「最後の」アイテムを取るとして扱ってください。

Junoセット修正 `.add()`は1つのアイテムを入れます、`.update()`はリストまたは他のイテラブルから一括で追加します。分けて保つペアは削除:`.remove()`はアイテムがない場合にエラーを出し、`.discard()`はそれを忍び寄り動き続けます。セットにないことが確実でないとき、`.discard()`は放浪のエラーを保存します。
Junoセット修正 1つに`.add()`、多く対任意のイテラブルに`.update()`。`.remove()`はミス時に`KeyError`を発生させます;`.discard()`はそれを無視する安全なバージョン。そして`.pop()`は「最後の」もの以外、任意の要素を引き出します。セットには順序がないため。
Junoセット修正 `.add()`はO(1)、`.update()`は`|=`。罠は`.remove()`が`.discard()`が静かに留まる場所で`KeyError`を発生させることです。存在が不確かなとき`.discard()`がデフォルト。`.pop()`は定義されていない要素を返します;決してそれを最後として読んでください。
python
tags = {"python", "beginner"}

tags.add("tutorial")          # 1つのアイテムを追加
tags.update(["web", "api"])   # 任意のイテラブルから複数のアイテムを追加
tags.remove("beginner")       # 削除、見つからない場合KeyErrorを発生させます
tags.discard("missing")       # 削除、見つからない場合エラーなし
tags.pop()                    # 削除して任意のアイテムを返す
tags.clear()                  # すべてを削除

アイテムが存在するかどうかが確実でないとき、.discard()を使用します。

フローズンセット

フローズンセットは、作成後に修正できないセットです。使用する主な理由:フローズンセットはハッシュ可能であるため、辞書キーまたは他のセット内に保存できます。

frozensetsetの不変カウンターパート。それはすべての読み取り操作とセット代数をサポートしますが、変更ではなく。その不変性はそれをハッシュ可能にします。これは、プレーンsetができない辞書キーまたは別のセット内のメンバーとして有効です。

frozensetは、作成後に変更できないsetです。その内部の何も動かないため、安定したハッシュを取得し、それ自体はハッシュ可能です。したがって、プレーンsetできない辞書キーまたは別のセットのメンバーになることができます。すべてが読み取りを行い、新しいコレクションを返す操作はまだ機能します(メンバーシップ、セット代数オペレータ)。変更メソッド(addremoveなど)が消えます。それが適切にフィット:一定のルックアップテーブル。プログラムの実行中に変わる必要がなく、辞書またはセット内に住む必要があります。

Junoフローズンセット フローズンセットは、一度作られたら変更できないセット。そのロックイン状態はそれをハッシュ可能にするため、通常のセットと違って、1つを辞書キーとして使用したり、別のセット内に詰め込むことができます。値が変わることのない固定グループの許可されたセットがあるときに到達します。
Junoフローズンセット `frozenset`は不変`set`:すべての読み取りとセット代数、変更なし。その不変性はハッシュ可能性を購入します。そのため、プレーン`set`が発生する場所で辞書キーまたは別のセットのメンバーとして機能します。一定のルックアップテーブルに最適ですフィット。
Junoフローズンセット `frozenset`は安定したハッシュを持ち、`set`できないどこかに行く:辞書キー、別のセットのメンバー。読み取りとセット代数が留まり、変更メソッドが消えます。きれいなユースケースは、実行時に変わらず、常にどこかに住む必要がない一定のルックアップテーブルです。
python
valid_statuses = frozenset({"active", "paused", "deleted"})
valid_statuses.add("archived")    # AttributeError、frozenseは不変

正しいコレクションを選ぶ

4つのタイプ、各々明確な役割で。何をしたい必要があるデータで尋ねてください。そして、正しい選択は通常、従います。

コレクションタイプ間の選択は、何の操作が重要か、あなたのデータが持つ制約:可変性、順序、重複の処理、ルックアップ戦略について。

選択は部分パフォーマンス、部分意味。dictsetはハッシング経由でO(1)平均ルックアップを与えるため、メンバーシップをチェックすることは彼らが成長するときに高速です。listtupleはインデックスでO(1)アクセスを与えますがO(n)メンバーシップ、ここでinはサイズで遅くなります。他の軸は型が知らせるもの:tupleは不変性が可変性がハッシュ可能性を購入する固定レコード、リストは可変長シーケンスです。コレクションをハッシュ可能な辞書またはセット内の入れ子にする必要があるとき、tuplefrozensetは2つの組み込みタイプがそうできます。

Juno正しいコレクションを選ぶ 4つのタイプ、4つの明確な仕事:変更しますしたいもの順序に対してリスト、固定レコードはタプル、一意の値と高速「それはここにありますか?」チェックに対してセット、名前でもの検索に対して辞書。データで何をする必要があるかで尋ねてください。そして、正しいものは通常落ちます。
Juno正しいコレクションを選ぶ データが必要なもの上で選んでください:可変性、順序、重複が重要かどうか、またはあなたがどのようにもの検索。順序付けられたシーケンス用リスト修正レコード用タプル、一意値とO(1)メンバーシップ用セット、キー値ルックアップ用辞書。
Juno正しいコレクションを選ぶ 半分パフォーマンス、半分意味:`dict`と`set`はO(1)ルックアップを与え、`list`と`tuple`はインデックス経由でO(1)を与えますがO(n)メンバーシップ。`tuple`はまた「固定レコード」を知らせ、ハッシュ可能性を購入。ネスト可能なハッシュ可能コレクション必要なとき、`tuple`と`frozenset`あなたの2つのオプション。
listtuplesetdict
OrderedYesYesNoYes (insertion order)
MutableYesNoYesYes
DuplicatesYesYesNoNo (keys)
Access byIndexIndexn/aKey
Use whenOrdered, changeable sequenceFixed recordUnique values, fast membershipKey-value lookup

素早い判断規則:

  • 名前で何かルックアップが必要ですか? → dict
  • 修正可能性を持つ順序付けられたコレクション必要ですか? → list
  • 関連値の固定グループを持っていますか? → tuple
  • 一意値または高速メンバーシップテストが必要ですか? → set

実践

固定レコードを保存するタプルおよび一意の値を追跡するセット用:

python
home = (51.5074, -0.1278)   # 緯度、経度
office = (51.5155, -0.0922)

home_lat, home_lon = home
print(f"Home: {home_lat}, {home_lon}")

# 一意の訪問者をセットで追跡
visitors = set()
visitors.add("alice")
visitors.add("bob")
visitors.add("alice")    # 既にセットにあります、静かに無視されました
visitors.add("carol")

print(f"Unique visitors: {len(visitors)}")
print(f"alice visited: {'alice' in visitors}")
print(f"dave visited:  {'dave' in visitors}")

既に処理されたものを追跡するセットおよび残りの仕事を計算するため:

python
already_processed = {"report_jan.csv", "report_feb.csv"}
all_files = {"report_jan.csv", "report_feb.csv", "report_mar.csv", "report_apr.csv"}

to_process = all_files - already_processed
print(f"Files to process: {sorted(to_process)}")

for filename in sorted(to_process):
    print(f"Processing {filename}...")
    already_processed.add(filename)

print(f"Done. Total processed: {len(already_processed)}")

一定のルックアップテーブルに対してfrozensetを使用しおよびセット代数とO(1)メンバーシップテストを示す:

python
ALLOWED_METHODS = frozenset({"GET", "POST", "PUT", "PATCH", "DELETE"})
SAFE_METHODS = frozenset({"GET", "HEAD", "OPTIONS"})

# フローズンセット上のセット代数は通常のセットを返す
unsafe_allowed = ALLOWED_METHODS - SAFE_METHODS
print(f"Non-safe allowed methods: {unsafe_allowed}")

# frozenseはハッシュ可能なため、セット内に保存できます(プレーンセットは不可)
method_groups = {
    frozenset({"GET", "HEAD", "OPTIONS"}),
    frozenset({"POST", "PUT", "PATCH"}),
    frozenset({"DELETE"}),
}
print(f"Method groups: {len(method_groups)}")

method = "POST"
print(f"Allowed: {method in ALLOWED_METHODS}")
print(f"Safe:    {method in SAFE_METHODS}")

frozensetはO(1)ルックアップを運びハッシュ可能な型が必要な場所どこでも保存できます。2つのfrozensetオブジェクト上のセット代数はプレーンなsetを返します;それを不変に保つため、結果をfrozenset()で包みます。