Pythonでは、いつリストを使い、いつタプルを使うべきですか。
時々、選択肢がない、例えばあなたが持っているのなら
"hello %s you are %s years old" % x
xはタプルでなければなりません。
しかし、私がAPIを設計してデータ型を選択するようになったのであれば、ガイドラインは何ですか?
Cでstruct
sを使用するのと同じように異種のコレクション用のタプルと、配列を使用するのと同じように同種のコレクション用のリストがあるという強い文化があります。しかし、私はこれを他の答えで言及されている可変性の問題とは全く考えていません。均一性は強制されていませんが、可変性にはそれに歯があります(あなたは実際にタプルを変更することはできません)、そしてそれほど面白くない区別と思われます。
タプル は本質的に固定サイズですが、 リスト は動的です。
つまり、Tuple
は immutable で、list
は mutable です。
in
演算子を使用して、要素がTupleに存在するかどうかを確認することもできます。タプルはリストより速いです。 定数の値のセットを定義していて、それを反復するだけでよいのであれば、リストの代わりにTupleを使用してください。
変更する必要がないデータを「書き込み禁止」にすると、コードの安全性が高まります。リストの代わりにTupleを使用することは、このデータは定数であるという暗黙のassert文を持つようなものであり、それをオーバーライドするには特別な思考(および特定の機能)が必要です。
一部のタプルは辞書キーとして使用できます(特に、文字列、数値、その他のタプルなどの不変値を含むタプル)。リストは不変ではないため、リストを辞書のキーとして使用することはできません。
出典: Python 3に飛び込む
主な違いは、Tupleがimmutable(代入後にその場で変更できない)であり、リストがmutableであることです。追加、変更、減算などができます。
それで、私は自分のタプルを代入後に変更すべきでないものにし、私のリストにできるものを変更する傾向があります。
それはミュータブルでなければなりませんか?リストを使ってください。それはミュータブルではないのですか?タプルを使用してください。
そうでなければ、それは選択の問題です。
異種のオブジェクトのコレクション(名前、通り、都市、州、郵便番号に分割された住所など)では、Tupleを使用することを好みます。 という名前のタプル にはいつでも簡単にプロモートできます。
同様に、コレクションが繰り返されるのであれば、リストが好きです。複数のオブジェクトを1つのオブジェクトとして保持するための単なるコンテナであれば、私はTupleを好みます。
あなたが決める必要がある最初の事はデータ構造が可変である必要があるかどうかです。すでに述べたように、リストは可変であり、タプルはそうではありません。これはまた、タプルを辞書キーに使用できることを意味しますが、リストは使用できません。
私の経験では、順序と位置が意味があり一貫している場合、タプルは一般的に使用されています。たとえば、自分で選んだアドベンチャーゲームを選択するためのデータ構造を作成する際には、Tuple内の位置が意味を持つため、リストではなくタプルを使用することにしました。そのデータ構造の一例を次に示します。
pages = {'foyer': {'text' : "some text",
'choices' : [('open the door', 'Rainbow'),
('go left into the kitchen', 'bottomless pit'),
('stay put','foyer2')]},}
Tupleの最初の位置は、ユーザーがゲームをプレイするときにユーザーに表示される選択肢であり、2番目の位置はその選択肢が表示されるページのキーです。これはすべてのページで同じです。
タプルはリストよりもメモリ効率がよくなりますが、その利点がいつ明らかになるかはわかりませんが。
Think Python にあるリストやタプルの章もチェックしてください。
しかし、私がAPIを設計してデータ型を選択するようになったのであれば、ガイドラインは何ですか?
入力パラメータについては、必要なことをする最も一般的なインタフェースを受け入れるのが最善です。単なるTupleやリストであることはめったにありません - シーケンス、スライス可能、さらには反復可能であることがより頻繁にあります。あなたが明示的に入力タイプをチェックしない限り、Pythonのアヒルタイプは通常それを無料で手に入れます。絶対にやむを得ない場合を除き、そうしないでください。
あなたが作り出すデータ(出力パラメータ)のためにちょうどあなたにとって最も便利なものを返してください、例えば保持しているデータ型やヘルパー関数が返すデータ型を返します。
覚えておくべきことの一つは、あなたの状態の一部であるリスト(または他の可変)を返すことを避けることです。
class ThingsKeeper
def __init__(self):
self.__things = []
def things(self):
return self.__things #outside objects can now modify your state
def safer(self):
return self.__things[:] #it's copy-on-write, shouldn't hurt performance
Tupleよりもリストのマイナーではあるが注目に値する利点は、リストの方がやや移植性が高いということです。標準的なツールはタプルをサポートする可能性が低いです。たとえば、JSONにはタプル型はありません。 YAMLは行いますが、その構文はリストの構文と比べると醜いです。
そのような場合は、内部的にTupleを使用してからエクスポートプロセスの一部としてリストに変換することをお勧めします。あるいは、一貫性を保つためにリストをいたるところで使用することをお勧めします。