Python タプルとリスト: 類似点と相違点の説明

公開: 2022-08-08

このガイドでは、Python のタプルリスト類似点相違点について学習します。 また、タプルを使用する必要がある場合も理解できます。

リストとタプルはどちらも Python の組み込みデータ構造です。 要素のコレクションを格納するために使用できます。

インデックス作成とスライスのサポートから異種データ型の包含まで、タプルとリストは同様の機能を持っているように見えるかもしれません。 したがって、この 2 つの類似点と相違点を理解すると、使用するデータ構造を決定するのに役立ちます。

さぁ、始めよう。

Python REPL を開始して、このチュートリアルに従ってください。 Geekflare のオンライン Python エディターを使用してコーディングすることもできます。

Python タプルとリスト: 類似点は何ですか?

リストとタプルの類似点を学ぶことから始めましょう。 より良い学習を促進するために、リストとタプルの両方の例を示します。

python-タプル-vs-リスト

#1 。 Python イテラブル

Python では、リストは一対の角括弧で囲まれますが、タプルは括弧で囲まれます。 括弧を使用せずに、コンマで区切られた一連の値としてタプルを作成することもできます。

どちらもイテラブルです。 forループを使用してそれらをループできます。

以下のコード セルは、リストを反復処理する方法を示しています。

 nums = [2,6,7,10] print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'list'> 2 6 7 10

以下で説明するように、ループを使用してタプルを反復処理することもできます

nums = (2,6,7,10) # Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check! print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'tuple'> 2 6 7 10

#2 。 他のシーケンスからの作成のサポート

リストとタプルの次の類似点は、文字列などの既存のシーケンスから作成できることです。

 sample_str = "Coding!"

次のコード セルは、リスト項目が文字列内の文字であるリストをlist(string)が返す方法を示しています。

 list_from_str = list(sample_str) print(list_from_str) # Output ['C', 'o', 'd', 'i', 'n', 'g', '!']

同様に、 tuple(sequence)を使用して、文字列またはその他のシーケンスからタプルを作成できます。 以下のコード セルは、その方法を示しています。

 tuple_from_str = tuple(sample_str) print(tuple_from_str) # Output ('C', 'o', 'd', 'i', 'n', 'g', '!')

#3 。 インデックス作成とスライスのサポート

Python は、最初の要素がインデックス 0、2 番目の要素がインデックス 1 というようにゼロ インデックスをサポートしています。 Python は、最後の要素がインデックス -1、最後から 2 番目の要素がインデックス -2 というように、負のインデックスもサポートしています。

 list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[1]) # o

インデックス -2 の項目は、最後から 2 番目の項目 'g' です。

 tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[-2]) # g

リストまたはタプルの小さなセクションを操作する場合は、スライスを使用できます。 list[start:end] は、インデックス start から end – 1 までのリストのスライスを返します。start のデフォルト値は 0 で、end は iterable の最後の要素です。

同じ構文を使用してタプルをスライスできます。 前に作成したリストとタプルのスライスを作成しましょう。

 list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[0:5]) ['C', 'o', 'd', 'i', 'n']

開始値と終了値に加えて、ステップ値も指定できます。 tuple(start:end:step)は、 startからend - 1までのタプルのスライスをstepのステップで返します。

 tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[::2]) ('C', 'd', 'n', '!')

ここでは、ステップ値を 2 に設定します。したがって、スライスには 1 つおきの要素が含まれます。

#4 。 複数のデータ型のコレクション

検討した例では、リストとタプルのすべての項目が同じデータ型でした。

ただし、1 つのリストまたはタプル内に異なるデータ型の値を格納することはできます。

student_listの下のコード スニペットには、生徒の名前が文字列として、年齢が整数として、マークが float として含まれています。

 student_list = ["John",22,96.5] for item in student_list: print(f"{item} is of type {type(item)}") # Output John is of type <class 'str'> 22 is of type <class 'int'> 96.5 is of type <class 'float'>

タプルについても同様の例を思いつくことができます。

 student_tuple = ("Jane",23,99.5) for item in student_tuple: print(f"{item} is of type {type(item)}") # Output Jane is of type <class 'str'> 23 is of type <class 'int'> 99.5 is of type <class 'float'>

#5 。 メンバーシップ テストのサポート

リストとタプルの両方を使用すると、特定のアイテムの存在についてメンバーシップ テストを実行できます。 特定のアイテムがリストまたはタプルに存在するかどうかを確認したい場合は、 in演算子を使用できます。

iterable にitemが含まれている場合、 iterableの式item in iterable Trueと評価されます。 それ以外の場合はFalse

 "Alex" in student_list # False "Jane" in student_tuple # True

ここまでで、Python におけるリストとタプルの類似点について学習しました。 次に、2 つのデータ構造の主な違いを学びましょう。

Python タプルとリスト: 違いは何ですか?

#1 。 Python でのリストの可変性とタプルの不変性

Python におけるリストとタプルの最も重要な違いは、タプル不変であることです。 これは、タプルをその場で変更できないことを意味します。

️ 一例です。

 tuple1 = ("Java","Python","C++") tuple1[0] = "Rust" # Output ----> 2 tuple1[0] = "Rust" TypeError: 'tuple' object does not support item assignment

リストは変更可能なデータ構造であるため、次のコード セルのように、特定のインデックスの項目を変更することでリストを変更できます。

 list1 = ["Java","Python","C++"] list1[0] = "Rust" print(list1) # Output ['Rust', 'Python', 'C++']

#2 。 可変長リスト vs 固定長タプル

Python リストは可変長のデータ構造です。

次のことができます。

  • リストの最後にアイテムを追加する
  • 別のリストの項目を現在のリストの最後に追加する
  • リストから特定のインデックスのアイテムを削除する
list1 = [2,3,4,5] # add an item to the end list1.append(9) print(list1) # add items from list2 to the end of list1 list2 = [0,7] list1.extend(list2) print(list1) # remove an item from list1 list1.pop(0) print(list1)

️ 上記のコード スニペットの出力。

 # Output [2, 3, 4, 5, 9] [2, 3, 4, 5, 9, 0, 7] [3, 4, 5, 9, 0, 7]

タプルは固定長のデータ構造です。 したがって、既存のタプルから要素を追加または削除することはできません。 ただし、タプルを再定義して別の要素を含めることができます。

 tuple1 = (2,4,6,8) tuple1 = (1,8,9) print(tuple1) # Output (1, 8, 9)

#3 。 メモリ内のサイズ

前のセクションで学んだことの上に構築します:リスト可変長のデータ構造です。

最初にリストを定義すると、特定のサイズがメモリに割り当てられます。 これで、 append()またはextend()メソッドを使用してリストを変更する場合、追加された要素を格納するために追加のメモリを割り当てる必要があります。 この割り当ては、ほとんどの場合、追加するアイテムの数よりも多く行われます。

そのため、リストのアイテム数と割り当てられたスペースを追跡する必要があります。 さらに、リストは可変長であるため、リスト項目のアドレスを指すポインターがあります。 その結果、長さkのリストは、同じkの要素を持つタプルよりも多くのメモリを消費します。

これが簡単な図です。

python-tuple-vs-list-size

組み込みの sys モジュールのgetsizeof()メソッドを Python オブジェクトで使用して、メモリ内のオブジェクトのサイズを取得できます。

 import sys list1 = [4,5,9,14] list_size = sys.getsizeof(list1) print(f"Size of list:{list_size}") tuple1 = (4,5,9,14) tuple_size = sys.getsizeof(tuple1) print(f"Size of tuple:{tuple_size}")

以下の出力で確認されるように、要素の数と値が同じ場合、リストはタプルよりも多くのメモリを消費します。

 # Output Size of list:104 Size of tuple:88
タプル対リストのpython

Python タプルを使用する必要がある場合

Python のリストとタプルの相違点と類似点から、変更可能なコレクションが必要な場合はlistを使用する必要があることがわかります。

しかし、代わりにタプルを使用する必要があるのはどのような場合でしょうか。

このセクションではそれについて説明します。

#1 。 読み取り専用コレクション

コレクションを不変にしたいときはいつでも、それをタプルとして定義する必要があります。 color = (243,55,103)は、色合いに対応する RGB 値を含むタプルであるとします。 色をタプルとして定義すると、変更できないことが保証されます。

本質的に、コレクションを読み取り専用にする必要がある場合: プログラム中に値を変更してはならない場合は、タプルの使用を検討する必要があります。 これにより、意図しない値の変更を防ぐことができます。

#2 。 辞書キー

たとえば、リスト アイテムkey_listをキーとして使用して辞書を作成します。 dict.fromkeys()メソッドを使用して、リストから辞書を作成できます。

 key_list = list("ABCD") dict.fromkeys(key_list) {'A': None, 'B': None, 'C': None, 'D': None}

ディクショナリを作成する前に、最初の要素 (インデックス 0) として 'D' を含むようにリストを変更するとします。

では、辞書のキー「A」はどうなるでしょうか。

key_listから辞書を作成し、キー「A」に対応する値にアクセスしようとすると、 KeyErrorが発生します。

 key_list[0] = 'D' dict.fromkeys(key_list)['A'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-31-c90392acc2cf> in <module>() ----> 1 dict.fromkeys(key_list)['A'] KeyError: 'A'

ディクショナリのキーは一意である必要があります。 したがって、2 番目の「D」をキーとして使用することはできません。

 dict.fromkeys(key_list) {'B': None, 'C': None, 'D': None} # A is no longer a key.

代わりにタプルを使用すると、そのような変更は不可能になり、エラーが発生する可能性が低くなります。 したがって、タプルの項目をキーとして使用して辞書を作成することをお勧めします。

 key_tuple = tuple("ABCD") dict.fromkeys(key_tuple) {'A': None, 'B': None, 'C': None, 'D': None} key_tuple[0] = 'D' --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-2cecbefa7db2> in <module>() ----> 1 key_tuple[0] = 'D' TypeError: 'tuple' object does not support item assignment

#3 。 関数の引数

タプルの不変性は、関数の引数として渡すのにも適しています。

次の関数find_volume()を考えてみましょう。この関数は、指定された長さ、幅、および高さの直方体の体積を返します。

 def find_volume(dimensions): l,b,h = dimensions return l*b*h

これらのディメンションが、 dimensionsと呼ばれるリストで使用可能であるとします。 引数としてdimensionsを指定してfind_volume()を呼び出すと、ボリュームが返されます。

 dimensions = [2,8,5] find_volume(dimensions) 80

リストに格納されているディメンションはいつでも変更できます。

 dimensions = [20,8,5] find_volume(dimensions) 800

ただし、値を一定に保ち、変更できないようにする必要がある場合があります。 その場合は、引数をタプルとして保存し、関数呼び出しで使用することを検討する必要があります。

#4 。 関数からの戻り値

Python では、関数からの戻り値でタプルに出くわします。 関数から複数の値を返す場合、Python は暗黙的にそれらをタプルとして返します。

次の関数return_even()を検討してください。

 def return_even(num): even = [i for i in range(num) if (i%2==0)] return even,len(even)
  • 引数として数値numを取ります
  • 間隔[0,num)内の偶数のリストとそのリストの長さを返します。

num 20 の値を設定して関数を呼び出しましょう。

 num = 20

return_even()を呼び出すと、2 つの値がタプルで返されます。 関数呼び出しを検証引数としてtype()関数を呼び出すことができます。

 type(return_even(num)) # <class 'tuple'>

戻り値を出力して、最初の項目として偶数のリストを含み、2 番目の項目としてリストの長さを含むタプルであることを確認できます。

 print(return_even(num)) ([0, 2, 4, 6, 8, 10, 12, 14, 16, 18], 10)

タプルには 2 つの項目があるため、以下に示すように、それらを 2 つの変数にアンパックできます。

 even_nums, count = return_even(num) print(even_nums) print(count) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 10

結論

このチュートリアルが、Python のタプルとリストの包括的な比較を提供したことを願っています。

簡単な要約でチュートリアルを締めくくりましょう。

  • リストとタプルは Python の組み込みデータ構造です。
  • 類似点: イテラブル、インデックス作成のサポート、スライス、さまざまなデータ型、メンバーシップ テストの演算子。
  • 主な違い: リストは可変で、タプルは不変です。
  • その他の違い: タプルの固定長とリストの可変長、タプルのメモリ内のサイズが小さい。
  • いつタプルを使用する必要がありますか? 不変のコレクション、辞書のキー、および関数の引数の場合。

次に、Python プロジェクトをチェックして、練習して学習してください。 または、Python リストから重複項目を削除する方法を学びます。 ハッピーラーニング! それでは、ハッピーコーディング!