Python リストとタプル

PythonBeginner
オンラインで実践に進む

はじめに

この実践的な Python のリストとタプルに関する実験(Lab)へようこそ。リストは Python における最も基本的で多用途なデータ構造の 1 つであり、順序付けられたアイテムのコレクションを格納できます。タプルも同様ですが、重要な違いとして、それらはイミュータブル(変更不可能)です。

この実験を通して、リストの作成方法、要素へのアクセスと操作方法、ソートやループなどの一般的な操作の実行方法を学びます。また、タプルを探求し、リストよりもタプルを使用すべき状況を理解します。

この実験環境は、事前に設定された WebIDE です。この実験に必要なすべてのファイルは、/home/labex/project ディレクトリ内に作成されています。早速始めましょう。

リスト要素へのアクセス

このステップでは、インデックスを使用してリストから要素を取得する方法と、スライスを使用してサブリストを抽出する方法を学習します。リストは、角括弧 [] で囲まれた順序付けられたアイテムのコレクションです。

まず、左側のファイルエクスプローラーからファイル step1_access.py を開きます。このファイルにコードを記述します。

注: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこちらの実験 (lab) で学習してください。

インデックスを使用した値の取得

リスト要素にはゼロベースのインデックスを使用してアクセスします。つまり、最初の要素はインデックス 0 にあります。

リストを作成し、その最初の要素にアクセスするために、step1_access.py に次のコードを追加します。

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 最初の要素 (インデックス 0) にアクセス
print(furniture[0])

スクリプトを実行するには、WebIDE でターミナルを開き、次のコマンドを実行します。

python3 /home/labex/project/step1_access.py

コンソールにリストの最初の要素が出力されるはずです。

出力:

table

負のインデックス

負のインデックスを使用して、リストの末尾から要素にアクセスすることもできます。インデックス -1 は最後の要素を指し、-2 は最後から 2 番目の要素を指します。

最後の要素にアクセスするように step1_access.py を変更します。

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 最後の要素 (インデックス -1) にアクセス
print(furniture[-1])

スクリプトを再度実行します。

python3 /home/labex/project/step1_access.py

出力:

shelf

スライスを使用したサブリストの取得

スライスを使用すると、[start:end] 構文を使用してサブリストを取得できます。start インデックスは含まれ、end インデックスは含まれません。

これで練習してみましょう。検証チャレンジのために、step1_access.py を変更してリストを作成し、そのスライスを出力してください。既存の内容を次のコードに置き換えます。

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## インデックス 1 からインデックス 3 (3 は含まない) までのサブリストを取得
sublist = furniture[1:3]
print(sublist)

スクリプトを実行して結果を確認します。

python3 /home/labex/project/step1_access.py

出力:

['chair', 'rack']

完全なスライス [:] を使用してリストのコピーを作成することもできます。元のリストに加えられた変更は、コピーには影響しません。

## step1_access.py

spam = ['cat', 'bat', 'rat', 'elephant']
spam2 = spam[:]  ## シャローコピーを作成
spam.append('dog')

print(spam)
print(spam2)

スクリプトを実行します。

python3 /home/labex/project/step1_access.py

出力:

['cat', 'bat', 'rat', 'elephant', 'dog']
['cat', 'bat', 'rat', 'elephant']

['chair', 'rack'] のスライスを正常に出力した後、Verify ボタンをクリックして次のステップに進んでください。

リストの変更と操作

このステップでは、リストの内容を管理および変更する方法を探ります。これには、値の変更、リストの結合、新しい要素の追加が含まれます。

開始するために、step2_modify.py ファイルを開きます。

len() を使用したリストの長さの取得

len() 関数は、リスト内のアイテムの数を返します。

step2_modify.py に次のコードを追加します。

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']
print(len(furniture))

スクリプトを実行します。

python3 /home/labex/project/step2_modify.py

出力:

4

インデックスを使用した値の変更

リスト内の要素は、新しい値をそのインデックスに代入することで変更できます。

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']
furniture[0] = 'desk'  ## 最初の要素を変更
print(furniture)

スクリプトを実行します。

python3 /home/labex/project/step2_modify.py

出力:

['desk', 'chair', 'rack', 'shelf']

結合と複製 (+ および *)

+ 演算子(結合、concatenation)を使用して 2 つのリストを結合したり、* 演算子(複製、replication)を使用してリストの内容を繰り返したりできます。

## step2_modify.py

list1 = [1, 2, 3]
list2 = ['A', 'B', 'C']
combined_list = list1 + list2
print(combined_list)

replicated_list = ['X'] * 3
print(replicated_list)

スクリプトを実行します。

python3 /home/labex/project/step2_modify.py

出力:

[1, 2, 3, 'A', 'B', 'C']
['X', 'X', 'X']

append() および insert() を使用した値の追加

  • append() メソッドは、リストの末尾にアイテムを追加します。
  • insert() メソッドは、指定されたインデックスにアイテムを追加します。

検証タスクのために、これらの操作を組み合わせてみましょう。step2_modify.py の内容を次のコードに置き換えてください。このスクリプトはリストを作成し、末尾に要素を追加し、先頭に別の要素を挿入します。

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']

## リストの末尾に 'bed' を追加
furniture.append('bed')

## リストの先頭(インデックス 0)に 'desk' を挿入
furniture.insert(0, 'desk')

print(furniture)

スクリプトを実行して、最終的に変更されたリストを確認します。

python3 /home/labex/project/step2_modify.py

出力:

['desk', 'table', 'chair', 'rack', 'shelf', 'bed']

スクリプトが正しい出力を生成したら、Verify をクリックしてください。

値の削除とソート

このステップでは、リストからアイテムを削除するさまざまな方法と、リストの内容をソートする方法について学習します。

step3_remove.py ファイルを開いてください。

値の削除

Python には、リストからアイテムを削除するためのいくつかの方法があります。

  • del ステートメント: 特定のインデックスにあるアイテムを削除します。
  • remove() メソッド: 特定の値の最初の出現を削除します。
  • pop() メソッド: 特定のインデックスにあるアイテムを削除して返します(インデックスが指定されていない場合は最後のアイテム)。

それらがどのように機能するかを見てみましょう。step3_remove.py にこれを追加します。

## step3_remove.py

furniture = ['table', 'chair', 'rack', 'shelf']
del furniture[2]  ## 'rack' を削除
print(furniture)

furniture.remove('chair') ## 'chair' を削除
print(furniture)

スクリプトを実行します。

python3 /home/labex/project/step3_remove.py

出力:

['table', 'chair', 'shelf']
['table', 'shelf']

sort() を使用した値のソート

sort() メソッドはリストをインプレース(その場で)でソートします。デフォルトでは昇順にソートされます。

## step3_remove.py

numbers = [2, 5, 3.14, 1, -7]
numbers.sort()
print(numbers)

letters = ['a', 'z', 'A', 'Z']
letters.sort(key=str.lower) ## 大文字・小文字を区別しないソート
print(letters)

スクリプトを実行します。

python3 /home/labex/project/step3_remove.py

出力:

[-7, 1, 2, 3.14, 5]
['a', 'A', 'z', 'Z']

検証タスクのために、リストを作成し、特定のアイテムを削除してから、残りのアイテムをソートする必要があります。step3_remove.py の内容を次のように置き換えてください。

## step3_remove.py

furniture = ['table', 'chair', 'rack', 'shelf']

## アイテム 'rack' を削除
furniture.remove('rack')

## リストをアルファベット順にソート
furniture.sort()

print(furniture)

スクリプトを実行して結果を確認します。

python3 /home/labex/project/step3_remove.py

出力:

['chair', 'shelf', 'table']

スクリプトがリストを正しく削除してソートした後、Verify をクリックしてください。

ループ処理と高度なテクニック

このステップでは、リストを反復処理する方法と、高度だが非常に役立つリストのテクニックを習得します。

このセクションのために step4_loop.py ファイルを開いてください。

for を使用したループ処理

for ループは、リスト内のアイテムを反復処理するための標準的な方法です。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']

for item in furniture:
    print(item)

スクリプトを実行します。

python3 /home/labex/project/step4_loop.py

出力:

table
chair
rack
shelf

enumerate() を使用したインデックスと値の取得

反復処理中にインデックスと値の両方が必要な場合は、enumerate() 関数を使用します。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']

for index, item in enumerate(furniture):
    print(f'index: {index} - item: {item}')

スクリプトを実行します。

python3 /home/labex/project/step4_loop.py

出力:

index: 0 - item: table
index: 1 - item: chair
index: 2 - item: rack
index: 3 - item: shelf

in および not in 演算子

これらの演算子を使用すると、値がリスト内に存在するかどうかを確認できます。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']
print('rack' in furniture)
print('bed' not in furniture)

スクリプトを実行します。

python3 /home/labex/project/step4_loop.py

出力:

True
True

zip() を使用した複数のリストのループ処理

zip() 関数は、複数のリストを並行して処理するのに最適です。これは、各リストの要素をペアにします。

検証タスクでは、zip() を使用して 2 つのリストを結合します。step4_loop.py の内容を次のコードに置き換えてください。これは、家具アイテムとその対応する価格を反復処理し、各ペアに対してフォーマットされた文字列を出力します。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']
price = [100, 50, 80, 40]

for item, amount in zip(furniture, price):
    print(f'The {item} costs ${amount}')

スクリプトを実行して、結合された出力を確認します。

python3 /home/labex/project/step4_loop.py

出力:

The table costs $100
The chair costs $50
The rack costs $80
The shelf costs $40

スクリプトが正しく動作したら、Verify をクリックしてください。

タプル(Tuple)の理解

この最終ステップでは、タプルというデータ型について学習します。タプルはリストに似ていますが、イミュータブル(変更不可能)であり、作成後にその内容を変更することはできません。

このセクションのために step5_tuple.py ファイルを開いてください。

タプル (Tuple) データ型

タプルは、角括弧 [] の代わりに丸括弧 () を使用して定義されます。イミュータブルであるため、タプルが作成された後に要素を変更、追加、削除することはできません。これにより、メモリ効率が向上し、変更すべきではないデータに適しています。

リストと同様に、インデックスとスライスを使用してタプルの要素にアクセスできます。

## step5_tuple.py

furniture = ('table', 'chair', 'rack', 'shelf')

## 要素へのアクセス
print(furniture[0])

## スライス
print(furniture[1:3])

## 長さの取得
print(len(furniture))

スクリプトを実行します。

python3 /home/labex/project/step5_tuple.py

出力:

table
('chair', 'rack')
4

タプルを変更しようとすると、Python は TypeError を発生させます。例えば、furniture[0] = 'desk' はエラーを引き起こします。

list() と tuple() の間の変換

list() および tuple() コンストラクタ関数を使用して、リストとタプル間で簡単に変換できます。

検証タスクのために、リストをタプルに変換します。step5_tuple.py の内容を次のコードに置き換えてください。

## step5_tuple.py

## アイテムのリスト
my_list = ['cat', 'dog', 5]

## リストをタプルに変換
my_tuple = tuple(my_list)

print(my_tuple)

スクリプトを実行して、結果のタプルを確認します。

python3 /home/labex/project/step5_tuple.py

出力:

('cat', 'dog', 5)

変更が必要な場合は、タプルをリストに戻すこともできます。

## step5_tuple.py

my_tuple = ('cat', 'dog', 5)
my_list = list(my_tuple)
print(my_list)

スクリプトを実行します。

python3 /home/labex/project/step5_tuple.py

出力:

['cat', 'dog', 5]

スクリプトがリストをタプルに正常に変換して出力した後、Verify をクリックしてこの実験 (lab) を完了してください。

まとめ

この実験 (lab) の完了、おめでとうございます!Python の主要なデータ構造であるリストとタプルについて、確かな理解を得ることができました。

以下のことを学びました。

  • リストの作成と、正のインデックスおよび負のインデックスを使用した要素へのアクセス。
  • スライスを使用したサブリストの抽出。
  • 値の変更、append() および insert() を使用した要素の追加、del、remove()、pop() を使用した要素の削除によるリストの変更。
  • sort() メソッドを使用したリストのインプレース (in-place) ソート。
  • for ループ、enumerate()、zip() を使用したリストの効率的な反復処理。
  • タプルのイミュータブル(変更不可能)な性質の理解と、リストとタプル間の変換。

これらのスキルは、すべての Python プログラマーにとって基礎となるものであり、今後のプロジェクトで非常に貴重なものとなるでしょう。