多くの場所で、(1,2,3)
(タプル)と[1,2,3]
(リスト)は同じ意味で使用できます。
どちらを使用する必要がありますか、またその理由は何ですか?
Python FAQから:
リストとタプルは多くの点で似ていますが、一般的には根本的に異なる方法で使用されます。タプルは、Pascal レコードまたは C 構造体に似ていると考えることができます。それらは、グループとして操作されるさまざまなタイプの関連データの小さなコレクションです。たとえば、デカルト座標は、2 つまたは 3 つの数値のタプルとして適切に表されます。
一方、リストは他の言語の配列に似ています。それらは、すべて同じタイプを持ち、1 つずつ操作されるさまざまな数のオブジェクトを保持する傾向があります。
通常、慣例により、(不) 可変性だけに基づいてリストまたはタプルを選択することはありません。本格的なクラスが重すぎるような完全に異なるデータの小さなコレクションにはタプルを選択し、同種のデータセットがある妥当なサイズのコレクションにはリストを選択します。
リスト[1,2,3]
は動的で柔軟ですが、その柔軟性にはスピードが犠牲になります。
タプル(1,2,3)
は固定 (不変) であるため、高速です。
タプルは、複合データ型を作成する迅速かつ柔軟な方法です。リストは、オブジェクトのリストのコンテナです。
たとえば、List を使用して、生徒の詳細のリストをクラスに格納します。
そのリスト内の各生徒の詳細は、ロール番号、名前、およびテストの点数を含む 3 つのタプルである場合があります。
`[(1,'Mark',86),(2,'John',34)...]`
また、タプルは不変であるため、辞書のキーとして使用できます。
タプルの概念は非常に表現力豊かです。
実用的には、値のパックとアンパックに最適です(x,y=coord
)。
辞書(ハッシュテーブル)と組み合わせることで、多くのレベルの関連付けを必要とするマッピングの形式が可能になります。たとえば、(x、y)が見つかったことをマークすることを検討してください。
// PHP
if (!isset($found[$x])) {
$found[$x] = Array();
$found[$x][$y] = true;
} else if (!isset($found[$x][$y])) {
$found[$x][$y] = true;
}
# Python
found[(x,y)] = True # parens added for clarity
リストは、その内容に対する操作を期待して使用する必要があります(したがって、不変性についてのさまざまな言及があります)。リストを使用して、ポップ、プッシュ、スプライス、スライス、検索、前に挿入、後に挿入などを行うことができます。
タプルは、単純な比較が行われるオブジェクトの低レベルの表現、または前述の座標の例など、予測可能な方法でn番目の要素またはn個の要素を抽出するなどの操作である必要があります。
最後に、リストはハッシュ可能ではないため、辞書(Perlのハッシュテーブル、PHPの連想配列)で行われるマッピングのタイプはタプルで行う必要があります。
これがタプルと辞書の簡単な例です。
"""
couple is a tuple of two people
doesLike is a dictionary mapping couples to True or False
"""
couple = "john", "jane"
doesLike = dict()
doesLike[couple] = True
doesLike["jane", "john"] = False # unrequited love :'(
[1, 2, 3]
アイテムを追加または削除できるリストです。
(1, 2, 3)
一度定義すると変更できないタプルです。
アイテムのコレクションを関数に渡す必要があるときはいつでも、関数が渡された値を変更しないようにしたい場合は、タプルを使用します。
それ以外の場合は、値を変更する関数が必要な場合は、リストを使用します。
外部ライブラリを使用していて、値のリストを関数に渡す必要があり、データの整合性が不明な場合は、常にタプルを使用してください。
他の人が述べたように、リストとタプルはどちらも Python オブジェクトを格納するために使用できるコンテナーです。リストは拡張可能であり、その内容は割り当てによって変更できますが、タプルは不変です。
また、リストは辞書のキーとして使用できませんが、タプルは使用できます。
コンソールを開き、python を実行します。これを試して:
>>> list = [1, 2, 3]
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
, '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__',
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
最後の行リストの最後にあるように、次のメソッドがあります: 'append'、'count'、'extend'、'index'、'insert'、'pop'、'remove'、'reverse'、'sort' '
タプルについても同じことを試してください:
>>> tuple = (1, 2, 3)
>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__
format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__get
slice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__
lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
, '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
リスト メソッドの「count」と「index」のみがここに表示されます。
これは、タプルが不変であり、変更をサポートしていないためです。代わりに、内部実装の方が簡単で高速です。
タプルで機能するソリューションが見つかった場合は、それらを使用してください。タプルは不変性を強制し、より機能的なパスを導きます。機能的/不変の道を進んだことを後悔することはほとんどありません。
(1,2,3)
はタプルで[1,2,3]
、リストです。どちらも数値のシーケンスを表しますが、タプルは不変であり、リストは可変の Python オブジェクトであることに注意してください。