違いは何ですか?
タプル/リストの長所/短所は何ですか?
タプルが不変であることとは別に、それらの使用法を導くべきである意味的な区別もあります。タプルは異種データ構造であり(すなわち、それらのエントリは異なる意味を有する)、一方リストは同種シーケンスである。 タプルは構造を持ち、リストは順序を持ちます。
この区別を使用すると、コードがより明確でわかりやすくなります。
一例は、本の中の場所を参照するためのページ番号と行番号のペアである。
my_location = (42, 11) # page number, line number
これを辞書のキーとして使用して、場所にメモを保存できます。一方、リストを使用して複数の場所を保存することもできます。当然のことながら、リストに場所を追加または削除したい場合があるので、リストは変更可能であることは理にかなっています。一方、既存の場所にアイテムを追加または削除することは意味がありません - したがって、タプルは不変です。
たとえば、ページの行を繰り返し処理するときなど、既存の場所Tuple内のアイテムを変更したい場合があります。しかし、Tupleの不変性により、新しい値ごとに新しい場所のTupleを作成する必要があります。これは面倒なことに思えますが、このように不変のデータを使用することは、値型と関数型プログラミング手法の礎石であり、これには大きな利点があります。
この問題に関する興味深い記事がいくつかあります。 "Pythonのタプルは単なる定数リストではない" または "Pythonのタプルとリストの関係を理解する" /。公式のPythonドキュメンテーション これについても言及しています
msgstr "タプルは不変であり、通常異種のシーケンスを含みます..."#:。
Haskellのような静的に型付けされた言語では、Tupleの値は一般に異なる型を持ち、Tupleの長さは固定されなければなりません。リストでは、値はすべて同じ型を持ち、長さは固定されていません。だから違いは非常に明白です。
最後に、Pythonには namedtuple があります。これは、Tupleがすでに構造を持つことになっているため、理にかなっています。これは、タプルがクラスやインスタンスに代わる軽量の代替手段であるという考えを強調しています。
リストとタプルの違い
リテラル
someTuple = (1,2)
someList = [1,2]
サイズ
a = Tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
Tuple操作はサイズが小さいため、少し速くなりますが、膨大な数の要素があるまではそれほど言及しません。
許可された操作
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
これはまた、要素を削除したりタプルをソートしたりできないことを意味します。ただし、listとTupleの両方に新しい要素を追加することもできますが、唯一の違いは、要素を追加することによってTupleのIDを変更することです。
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
使用方法
リストは変更可能であるため、辞書のキーとして使用することはできませんが、Tupleは使用できます。
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
ハッシュ可能 タプルはハッシュ可能ですが、リストはハッシュ可能ではありません。ハッシュ関数は、オブジェクトのハッシュ値があればそれを返します。
あなたが散歩に出かけた場合、あなたはいつでも(x,y)
タプルにあなたの座標を記録することができます。
あなたの旅を記録したい場合は、あなたは数秒ごとにあなたの場所をリストに追加することができます。
しかしあなたはそれを逆にすることはできませんでした。
主な違いは、タプルは不変であるということです。つまり、一度作成したTupleの値は変更できません。
そのため、値を変更する必要がある場合はListを使用してください。
タプルの利点
リストは変更可能です。タプルは違います。
docs.python.org/2/tutorial/datastructures.html から
タプルは不変であり、通常はアンパック(このセクションの後半を参照)またはインデックス付け(またはnamedtuplesの場合は属性による)を介してアクセスされる異種要素のシーケンスを含みます。リストは可変であり、それらの要素は通常同種であり、リストを繰り返すことによってアクセスされます。
それは 言及されている 違いは主に意味論的であるということです:人々は異なる情報を表すためにタプルとリストを期待します。しかし、これはガイドラインを超えるものです。実際には、渡された内容に基づいて動作が異なるライブラリもあります。 NumPyを例にとりましょう( 他の記事からコピーした /私はより多くの例を要求します):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
要点は、NumPyは標準ライブラリの一部ではないかもしれませんが、それは major Pythonライブラリであり、NumPyリストとタプル内ではまったく異なるものです。
リストはループ用、タプルは構造体、すなわち"%s %s" %Tuple
用です。
リストは通常同種、タプルは通常異種です。
リストは可変長用、タプルは固定長用です。
これはPythonリストの例です:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
これはPythonタプルの例です:
my_Tuple = (a,b,c,d,e)
celebrity_Tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Pythonリストとタプルは、どちらも順序付けられた値のコレクションであるという点で似ています。リストは、括弧「[...、...]」を使用して作成される浅い違いと、括弧「(...、...)」を使用するタプルに加えて、コア技術「ハードコーディングされたPython構文」の違いは、特定のタプルの要素が不変であるのに対し、リストは可変であるということです(...したがって、タプルのみがハッシュ可能であり、辞書/ハッシュキーとして使用できます!)。これは、それらの使用方法の違い(構文によってアプリオリを強制)と人々がそれらを使用する方法の違い(「ベストプラクティス」、事後、これが何smartプログラマーが行います)。タプルを使用するときとリストを使用するときを区別することの主な違いは、人々が要素の順序に与えるものmeaningにあります。
タプルの場合、「順序」は、情報を保持するための特定の「構造」以外のものを意味しません。最初のフィールドで見つかった値は、それぞれが2つの異なるディメンションまたはスケールで値を提供するため、2番目のフィールドに簡単に切り替えることができます。さまざまなタイプの質問への回答を提供し、通常は次の形式です:特定のオブジェクト/対象に対して、その属性は何ですか?オブジェクト/対象はそのままです定数、属性は異なります。
リストの場合、「順序」はシーケンスまたは方向性を意味します。 2番目の要素は最初の要素の後に来る必要があります。これは、特定の共通の縮尺または寸法に基づいて2番目に配置されるためです。要素は全体として取られ、ほとんどの場合、特定の属性に対してという形式の単一の質問に対する回答を提供しますが、これらのオブジェクト/対象はどのように比較されますか?属性は一定のままで、オブジェクト/サブジェクトは異なります。
大衆文化の人々やこれらの違いに準拠していないプログラマーの例は無数にあり、メインコースにサラダフォークを使用する可能性のある人は無数にいます。一日の終わりに、それは大丈夫であり、通常両方が仕事を成し遂げることができます。
より詳細な情報を要約するため
類似性:
インデックス付け、選択、およびスライス-タプルとリストは、括弧内にある整数値を使用してインデックス付けします。したがって、特定のリストまたはタプルの最初の3つの値が必要な場合、構文は同じになります。
>>> my_list[0:3]
[0,1,2]
>>> my_Tuple[0:3]
[a,b,c]
比較と並べ替え-2つのタプルまたは2つのリストは両方とも最初の要素によって比較され、同点がある場合は2番目の要素などによって比較されますに。以前の要素が違いを示した後は、後続の要素にそれ以上の注意は払われません。
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
True
>>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
True
差異:-定義により、アプリオリ
Syntax-リストは[]を使用し、タプルは()を使用します
Mutability-指定されたリストの要素は変更可能で、指定されたTupleの要素は変更できません。
# Lists are mutable:
>>> top_rock_list
['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
>>> top_rock_list[1]
'Kashmir'
>>> top_rock_list[1] = "Stairway to Heaven"
>>> top_rock_list
['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
# Tuples are NOT mutable:
>>> celebrity_Tuple
('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
>>> celebrity_Tuple[5]
'Dead'
>>> celebrity_Tuple[5]="Alive"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Tuple' object does not support item assignment
ハッシュテーブル(ディクショナリ)-ハッシュテーブル(ディクショナリ)はキーがハッシュ可能であり、したがって不変である必要があるため、リストではなくタプルのみがディクショナリキーとして機能できます。
#Lists CAN'T act as keys for hashtables(dictionaries)
>>> my_dict = {[a,b,c]:"some value"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#Tuples CAN act as keys for hashtables(dictionaries)
>>> my_dict = {("John","Wayne"): 90210}
>>> my_dict
{('John', 'Wayne'): 90210}
違い-使用法の事後
要素の同種と異種-一般に、リストオブジェクトは同種であり、タプルオブジェクトは異種です。つまり、リストは同じタイプのオブジェクト/サブジェクト(すべての大統領候補、またはすべての歌、またはすべてのランナーなど)に使用されますが、強制ではありませんが)、タプルは異種のオブジェクトにより多く使用されます。
ループと構造-両方ともループを許可しますが(my_list ...のxの場合)、リストに対してそれを行うのは本当に意味があります。タプルは、情報の構造化および表示に適しています(%sに存在する%s%sは%sであり、現在は%s%( "John"、 "Wayne"、90210、 "Actor"、 "Dead"))
list の値はいつでも変更できますが、 tuples の値は変更できません。
長所と短所 は用途によって異なります。変更したくないようなデータがある場合は、Tupleを使用する必要があります。それ以外の場合は、listが最良の選択肢です。
リストは同種のシーケンスであることを意図していますが、タプルは異種のデータ構造です。
タプルとリストはどちらもPythonでは似たようなシーケンス型です。
リテラル構文
新しいリストを得るためにタプルと角括弧[ ]
を作るのに括弧()を使います。また、必要な構造体 - タプルまたはリスト - を取得するために適切な型の呼び出しを使用することもできます。
someTuple = (4,6)
someList = [2,6]
ミュータビリティ
タプルは不変ですが、リストは可変です。この点が以下のものの基本です。
メモリ使用量
可変性があるため、リストにはより多くのメモリが、タプルにはより少ないメモリが必要です。
拡張
タプルとリストの両方に新しい要素を追加することができますが、タプルのIDが変更されるという唯一の違いがあります(つまり、新しいオブジェクトがあります)。
ハッシュ
タプルはハッシュ可能で、リストはそうではありません。それはあなたが辞書のキーとしてタプルを使用できることを意味します。リストを辞書のキーとして使用することはできませんが、Tupleは使用できます。
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
セマンティクス
この点はベストプラクティスについての詳細です。リストは同種のシーケンスですが、タプルを異種のデータ構造として使用する必要があります。
PEP 484-タイプヒント は、Tuple
の要素のタイプを個別に入力できることを示します。 Tuple[str, int, float]
;と言うことができます。しかし、list
型付けクラスを持つList
は、1つの型パラメーターのみをとることができます:List[str]
。 。
また、標準ライブラリはほとんどの場合、Cがstruct
を返すような標準関数からの戻り値としてTupleを使用します。
tuples
はミュータブルであり、lists
はイミュータブルであると人々はすでにここで答えていますが、私たちが覚えておかなければならないタプルを使用することの重要な側面があります
Tuple
の中にlist
またはdictionary
が含まれている場合は、Tuple
自体が不変であってもそれらを変更できます。
たとえば、リストと辞書を含むTupleがあるとしましょう。
my_Tuple = (10,20,30,[40,50],{ 'a' : 10})
リストの内容は次のように変更できます。
my_Tuple[3][0] = 400
my_Tuple[3][1] = 500
これは新しいTupleを次のようにします。
(10, 20, 30, [400, 500], {'a': 10})
tupleの中の辞書を次のように変更することもできます。
my_Tuple[4]['a'] = 500
これにより、タプル全体は次のようになります。
(10, 20, 30, [400, 500], {'a': 500})
これは、list
とdictionary
がオブジェクトであり、これらのオブジェクトは変化していないが、その内容が指しているためです。
そのためTuple
は例外なく不変のままです。
5.3のドキュメントからの方向見積もり。タプルとシーケンス :
タプルはリストと似ているように見えますが、さまざまな状況でさまざまな目的で使用されることがよくあります。タプルはimmutableであり、通常unpacking(このセクションの後半を参照)またはindexingを介してアクセスされる要素のheterogeneous sequence (または名前付きタプルの場合は属性によっても)。リストはmutableであり、それらの要素は通常homogeneousであり、リストの上でiteratingによってアクセスされます。
まず第一に、それらはどちらもPythonの非スカラーオブジェクト(複合オブジェクトとも呼ばれる)です。
+
を使用した連結(もちろん、新しいTupleが作成されます)(3,) # -> (3)
の代わりにシングルトン(3) # -> 3
[3]
new_array = Origin_array[:]
[x**2 for x in range(1,7)]
はあなたに[1,4,9,16,25,36]
を与えます(読めない)Listを使用するとエイリアスバグ(同じオブジェクトを指す2つの異なるパス)も発生する可能性があります。
リストは可変でタプルは不変です。この例を考えてください。
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #Tuple
今すぐlistとTupleのインデックス値を変更します。
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'Tuple' object does not support item assignment.
したがって、次のコードはTupleでは無効であることが証明されました。これは、Tupleを更新しようとしたためです。これは許可されていません。