Python 入門

Python リスト (List)

リスト(Lists)は Python における基礎的なデータ構造(Data Structure)であり、一種のオーダードコレクション(有序集合)として、あらゆるデータ型の要素(Element)を格納することができます。

リストはデータを保存、アクセス、操作するための柔軟な手法を提供しており、これらはあらゆるプログラミングタスクにおいて不可欠な存在です。

本章では、リストの作成、アクセス、および修正操作を全面的にカバーし、プログラム内でリストを効率的に利用するための基礎知識を提供します。

1. リストの作成

Python では、角括弧 [] を使用してリストを作成します。リスト内の要素はカンマで区切ります。一つのリストには、同じデータ型の要素を含めることも、異なるデータ型を混合して含めることも可能です。

1.1 空のリスト

空のリストとは、要素を一つも含まないリストのことです。空の角括弧をそのまま使用して作成できます。

# 空のリストを作成
empty_list = []
print(empty_list)  # 出力: []

1.2 要素を含むリスト

リストの初期化時には、整数(Integers)、浮動小数点数(Floats)、文字列(Strings)、さらには他のリストなど、さまざまなデータ型の要素を入れることができます。

# 整数のリストを作成
integer_list = [1, 2, 3, 4, 5]
print(integer_list)  # 出力: [1, 2, 3, 4, 5]

# 文字列のリストを作成
string_list = ["apple", "banana", "cherry"]
print(string_list)  # 出力: ['apple', 'banana', 'cherry']

# 混合データ型のリストを作成
mixed_list = [1, "hello", 3.14, True]
print(mixed_list)  # 出力: [1, 'hello', 3.14, True]

# ネストされたリスト(リストの中のリスト)を作成
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(nested_list)  # 出力: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

1.3 list() コンストラクタによる作成

list() コンストラクタ(Constructor)を使用すると、他のイテラブル(Iterable)なオブジェクト(文字列、タプル、セットなど)をリストに変換できます。

# 文字列からリストを作成
string = "Python"
list_from_string = list(string)
print(list_from_string)  # 出力: ['P', 'y', 't', 'h', 'o', 'n']

# タプルからリストを作成
tuple_example = (1, 2, 3)
list_from_tuple = list(tuple_example)
print(list_from_tuple)  # 出力: [1, 2, 3]

2. リスト要素へのアクセス

要素のインデックス(Index)を通じて、リスト内のデータにアクセスできます。Python では、リストのインデックスは 0 から始まります。つまり、最初の要素のインデックスは 0、2番目は 1、という具合に続きます。

2.1 正のインデックス

正のインデックスは、リストの先頭から後方に向かって要素にアクセスします。

my_list = ["apple", "banana", "cherry", "date"]

# 最初の要素にアクセス(インデックス 0)
first_element = my_list[0]
print(first_element)  # 出力: apple

# 3番目の要素にアクセス(インデックス 2)
third_element = my_list[2]
print(third_element)  # 出力: cherry

2.2 負のインデックス

負のインデックスを使用すると、リストの末尾から前方に向かって要素にアクセスできます。最後の要素のインデックスは -1、最後から2番目は -2 となります。

my_list = ["apple", "banana", "cherry", "date"]

# 最後の要素にアクセス(インデックス -1)
last_element = my_list[-1]
print(last_element)  # 出力: date

# 最後から2番目の要素にアクセス(インデックス -2)
second_last_element = my_list[-2]
print(second_last_element)  # 出力: cherry

3. リストのスライシング (Slicing)

スライシング操作により、インデックスの範囲を指定してリストの一部を抽出できます。スライシングの構文は list[start:end:step] です。

  • start(開始): スライスに含める最初の要素のインデックス(この値を含む)。省略した場合、デフォルトで 0 から始まります。
  • end(終了): スライスを終了する手前のインデックス(この値自体は含まない)。省略した場合、デフォルトでリストの末尾までとなります。
  • step(ステップ): 抽出する際の間隔(増分)。省略した場合、デフォルトは 1 です。
my_list = ["apple", "banana", "cherry", "date", "elderberry"]

# インデックス 1 から 3 までスライス(3は含まない)
slice_1 = my_list[1:3]
print(slice_1)  # 出力: ['banana', 'cherry']

# 先頭からインデックス 4 までスライス(4は含まない)
slice_2 = my_list[:4]
print(slice_2)  # 出力: ['apple', 'banana', 'cherry', 'date']

# インデックス 2 から末尾までスライス
slice_3 = my_list[2:]
print(slice_3)  # 出力: ['cherry', 'date', 'elderberry']

# ステップ 2 でスライス
slice_4 = my_list[0:5:2]
print(slice_4)  # 出力: ['apple', 'cherry', 'elderberry']

# リスト全体をスライス(コピーの作成)
slice_5 = my_list[:]
print(slice_5)  # 出力: ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 負のステップを使用してリストを反転
slice_6 = my_list[::-1]
print(slice_6) # 出力: ['elderberry', 'date', 'cherry', 'banana', 'apple']

4. ネストされたリストへのアクセス

ネスト(Nest)されたリスト(リストの中のリスト)内の要素にアクセスするには、各階層に対応する複数のインデックスを使用します。

nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 最初のサブリストの最初の要素にアクセス
element_1 = nested_list[0][0]
print(element_1)  # 出力: 1

# 2番目のサブリストの2番目の要素にアクセス
element_2 = nested_list[1][1]
print(element_2)  # 出力: 5

# 3番目のサブリストの3番目の要素にアクセス
element_3 = nested_list[2][2]
print(element_3)  # 出力: 9

5. リスト内包表記

リスト内包表記は、既存のリストに基づいて新しいリストを作成するための簡潔な手法を提供します。主に要素の修正やフィルタリング(Filtering)に使用されます。

numbers = [1, 2, 3, 4, 5]

# 各数字を2乗した新しいリストを作成
squared_numbers = [x**2 for x in numbers]
print(squared_numbers)  # 出力: [1, 4, 9, 16, 25]

# 偶数のみを含む新しいリストを作成(フィルタリング)
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # 出力: [2, 4]

# 文字列をすべて大文字に変換した新しいリストを作成
words = ["hello", "world"]
uppercase_words = [word.upper() for word in words]
print(uppercase_words) # 出力: ['HELLO', 'WORLD']