Python でリストを操作する

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

はじめに

この実験 (Lab) では、Python におけるリストの操作について実践的な経験を積みます。リストは、順序付けられたアイテムのコレクションを格納するための基本的なデータ構造です。リスト要素の作成、アクセス、追加、削除、変更方法を学習します。

さらに、この実験では、ソート、クエリ (問い合わせ)、リストのネストといった、より高度な操作についても順を追って説明します。この実験を終える頃には、Python プログラムでデータを管理・処理するためにリストを効果的に扱う方法について、確固たる理解が得られるでしょう。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 100%です。学習者から 100% の好評価を得ています。

リストの作成とアクセス

このステップでは、リストの作成方法とその要素へのアクセス方法を学習します。リストは順序付けられた変更可能な (mutable) アイテムのコレクションであり、Python の最も多用途なデータ型の一つです。

リストは角括弧 [] を使用して作成され、アイテムはコンマで区切られます。いくつかのリストを作成することから始めましょう。

左側の WebIDE ファイルエクスプローラーで、~/project ディレクトリ内にあるファイル list_creation.py を見つけて開きます。ファイルに次のコードを追加してください。

## Create an empty list
empty_list = []
print("Empty list:", empty_list)
print("Type of empty_list:", type(empty_list))

## Create a list of numbers
numbers = [10, 20, 30, 40, 50]
print("Numbers list:", numbers)

## Lists can contain elements of different data types
mixed_list = [1, 'hello', 3.14, True]
print("Mixed data type list:", mixed_list)

## You can also create a list from another iterable, like a string
string_list = list("python")
print("List from a string:", string_list)

コードを追加した後、ファイルを保存します。スクリプトを実行するには、WebIDE で統合ターミナルを開き、次のコマンドを実行します。

python ~/project/list_creation.py

リストを作成するさまざまな方法を示す、次の出力が表示されるはずです。

Empty list: []
Type of empty_list: <class 'list'>
Numbers list: [10, 20, 30, 40, 50]
Mixed data type list: [1, 'hello', 3.14, True]
List from a string: ['p', 'y', 't', 'h', 'o', 'n']

次に、リスト内の要素にアクセスする方法を探ります。要素には、そのインデックス(位置)によってアクセスできます。リストのインデックスは 0 から始まります。負のインデックスを使用することもでき、その場合 -1 は最後の要素を指します。

スライシング (Slicing) を使用すると、要素の範囲にアクセスできます。構文は list[start:stop:step] です。

list_creation.py ファイルの末尾に次のコードを追加します。

## Accessing list elements
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi']
print("\n--- Accessing Elements ---")
print("Fruits list:", fruits)

## Access the first element (index 0)
print("First element:", fruits[0])

## Access the last element (index -1)
print("Last element:", fruits[-1])

## Slicing: get elements from index 1 up to (but not including) index 4
print("Slice [1:4]:", fruits[1:4])

## Slicing: get all elements from the beginning up to index 3
print("Slice [:3]:", fruits[:3])

## Slicing: get all elements from index 2 to the end
print("Slice [2:]:", fruits[2:])

## Slicing: get a copy of the entire list
print("Slice [:] (a copy):", fruits[:])

## Slicing with a step: get every second element
print("Slice [::2]:", fruits[::2])

## Slicing to reverse the list
print("Reversed list [::-1]:", fruits[::-1])

ファイルを保存し、ターミナルからスクリプトを再度実行します。

python ~/project/list_creation.py

インデックス指定とスライシングの動作を理解するために、新しい出力を観察してください。

Empty list: []
Type of empty_list: <class 'list'>
Numbers list: [10, 20, 30, 40, 50]
Mixed data type list: [1, 'hello', 3.14, True]
List from a string: ['p', 'y', 't', 'h', 'o', 'n']

--- Accessing Elements ---
Fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi']
First element: orange
Last element: kiwi
Slice [1:4]: ['apple', 'pear', 'banana']
Slice [:3]: ['orange', 'apple', 'pear']
Slice [2:]: ['pear', 'banana', 'kiwi']
Slice [:] (a copy): ['orange', 'apple', 'pear', 'banana', 'kiwi']
Slice [::2]: ['orange', 'pear', 'kiwi']
Reversed list [::-1]: ['kiwi', 'banana', 'pear', 'apple', 'orange']

これで、リストの作成方法とその内容へのアクセス方法を学習しました。

リストの変更:要素の追加、削除、変更

このステップでは、リストの変更方法を学習します。リストは変更可能 (mutable) であるため、作成後もその要素を追加、削除、または変更することができます。

まず、要素の追加に焦点を当てます。Python にはいくつかのメソッドが用意されています。

  • append(): 単一の要素をリストの末尾に追加します。
  • extend(): イテラブル (iterable) (別のリストなど) からのすべての要素を末尾に追加します。
  • insert(): 特定のインデックスに要素を挿入します。

WebIDE ファイルエクスプローラーからファイル list_modification.py を開きます。次のコードをファイルに追加します。

## --- Adding Elements ---
my_list = [1, 2, 3]
print("Original list:", my_list)

## Add an element using append()
my_list.append(4)
print("After append(4):", my_list)

## Add multiple elements using extend()
my_list.extend([5, 6])
print("After extend([5, 6]):", my_list)

## Insert an element at a specific position
my_list.insert(1, 1.5) ## Insert 1.5 at index 1
print("After insert(1, 1.5):", my_list)

ファイルを保存し、ターミナルから実行します。

python ~/project/list_modification.py

出力は、各操作でリストがどのように増えていくかを示すはずです。

Original list: [1, 2, 3]
After append(4): [1, 2, 3, 4]
After extend([5, 6]): [1, 2, 3, 4, 5, 6]
After insert(1, 1.5): [1, 1.5, 2, 3, 4, 5, 6]

次に、要素の削除を練習しましょう。主要なメソッドには以下が含まれます。

  • remove(): 指定された値の最初の出現箇所を削除します。
  • pop(): 指定されたインデックスの要素を削除して返します(インデックスが指定されない場合は最後の要素)。
  • del: インデックスによってアイテムまたはスライスを削除するためのステートメントです。
  • clear(): リストからすべての要素を削除します。

list_modification.py の末尾に次のコードを追加します。

## --- Removing Elements ---
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple']
print("\n--- Removing Elements ---")
print("Original fruits list:", fruits)

## Remove the last element using pop()
popped_item = fruits.pop()
print("After pop():", fruits)
print("Popped item:", popped_item)

## Remove an element by its value using remove()
fruits.remove('pear')
print("After remove('pear'):", fruits)

## Remove an element by its index using del
del fruits[1] ## Deletes 'apple' at index 1
print("After del fruits[1]:", fruits)

## Clear all elements from the list
fruits.clear()
print("After clear():", fruits)

最後に、インデックスまたはスライスに新しい値を代入することで、既存の要素を変更できます。この最後のコードブロックを list_modification.py に追加します。

## --- Changing Elements ---
letters = ['a', 'b', 'c', 'd', 'e']
print("\n--- Changing Elements ---")
print("Original letters list:", letters)

## Change a single element
letters[0] = 'A'
print("After changing index 0:", letters)

## Change a slice of elements
letters[1:3] = ['B', 'C']
print("After changing slice [1:3]:", letters)

ファイルを保存し、もう一度スクリプトを実行します。

python ~/project/list_modification.py

完全な出力は、学習したすべての変更テクニックを示します。

Original list: [1, 2, 3]
After append(4): [1, 2, 3, 4]
After extend([5, 6]): [1, 2, 3, 4, 5, 6]
After insert(1, 1.5): [1, 1.5, 2, 3, 4, 5, 6]

--- Removing Elements ---
Original fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple']
After pop(): ['orange', 'apple', 'pear', 'banana', 'kiwi']
Popped item: apple
After remove('pear'): ['orange', 'apple', 'banana', 'kiwi']
After del fruits[1]: ['orange', 'banana', 'kiwi']
After clear(): []

--- Changing Elements ---
Original letters list: ['a', 'b', 'c', 'd', 'e']
After changing index 0: ['A', 'b', 'c', 'd', 'e']
After changing slice [1:3]: ['A', 'B', 'C', 'd', 'e']

これで、Python リスト内の要素の追加、削除、変更に習熟しました。

高度なリスト操作:ソート、クエリ、ネスト

この最終ステップでは、ソート、情報の問い合わせ、ネストされたリストの操作など、より高度なリスト操作を探ります。

まず、ソートから始めましょう。sort() メソッドはリストをインプレース (in-place) で変更します。昇順または降順にソートできます。

WebIDE でファイル list_operations.py を開きます。ソートを実演するために、次のコードを追加します。

## --- Sorting Lists ---
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print("--- Sorting Lists ---")
print("Original numbers list:", numbers)

## Sort the list in-place (ascending)
numbers.sort()
print("After sort():", numbers)

## Sort the list in descending order
numbers.sort(reverse=True)
print("After sort(reverse=True):", numbers)

## The reverse() method simply reverses the order, it does not sort
letters = ['a', 'b', 'c', 'd']
print("\nOriginal letters list:", letters)
letters.reverse()
print("After reverse():", letters)

ファイルを保存し、ターミナルから実行します。

python ~/project/list_operations.py

出力は、ソートされたリストと逆順にされたリストを示します。

--- Sorting Lists ---
Original numbers list: [3, 1, 4, 1, 5, 9, 2, 6]
After sort(): [1, 1, 2, 3, 4, 5, 6, 9]
After sort(reverse=True): [9, 6, 5, 4, 3, 2, 1, 1]

Original letters list: ['a', 'b', 'c', 'd']
After reverse(): ['d', 'c', 'b', 'a']

次に、リストに対して情報を問い合わせる方法を見てみましょう。

  • count(): 値が出現する回数を返します。
  • index(): 値が最初に出現したインデックスを返します。

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

## --- Querying Lists ---
fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
print("\n--- Querying Lists ---")
print("Fruits list:", fruits)

## Count the occurrences of an element
apple_count = fruits.count('apple')
print("Count of 'apple':", apple_count)

## Find the index of the first occurrence of an element
banana_index = fruits.index('banana')
print("Index of first 'banana':", banana_index)

最後に、ネストされたリスト (nested lists) について見てみましょう。ネストされたリストとは、他のリストを要素として含むリストのことです。これは、行列 (matrix) やグリッドのような 2 次元構造を作成するのに役立ちます。

この最後のコードブロックを list_operations.py に追加します。

## --- Nested Lists ---
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print("\n--- Nested Lists ---")
print("Matrix:", matrix)

## Access an entire inner list (a row)
first_row = matrix[0]
print("First row:", first_row)

## Access a specific element in the nested list
## To get the element '6', we access row 1, then column 2
element = matrix[1][2]
print("Element at matrix[1][2]:", element)

ファイルを保存し、スクリプトを最後に実行します。

python ~/project/list_operations.py

完全な出力は、ソート、問い合わせ、およびネストされたリストへのアクセスを実演します。

--- Sorting Lists ---
Original numbers list: [3, 1, 4, 1, 5, 9, 2, 6]
After sort(): [1, 1, 2, 3, 4, 5, 6, 9]
After sort(reverse=True): [9, 6, 5, 4, 3, 2, 1, 1]

Original letters list: ['a', 'b', 'c', 'd']
After reverse(): ['d', 'c', 'b', 'a']

--- Querying Lists ---
Fruits list: ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
Count of 'apple': 2
Index of first 'banana': 3

--- Nested Lists ---
Matrix: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
First row: [1, 2, 3]
Element at matrix[1][2]: 6

これで、Python リストを操作するためのいくつかの高度なテクニックを習得しました。

まとめ

この実験 (Lab) では、Python におけるリスト操作の基礎を学びました。まず、角括弧 []list() コンストラクタを使用してリストを作成しました。次に、リストの特定のアイテムやサブセットを取得するために不可欠な、インデックス指定 (indexing) とスライス (slicing) を用いたリスト要素へのアクセスを練習しました。

その後、append()extend()insert() を使った要素の追加、remove()pop()del を使った要素の削除、インデックス指定やスライス代入による要素の変更方法を探りました。最後に、sort() によるインプレースでのソート、reverse() による順序反転、count() および index() による問い合わせ、そしてネストされたリストによるデータ構造化といった高度な操作を扱いました。これで、Python プロジェクトでリストを効果的に使用するための十分な知識が身につきました。