はじめに:Pythonの「シーケンス」でつまずいていませんか?
Pythonを学び始めると、リストやタプル、文字列など、似ているけれど少し違うデータ型がたくさん出てきます。そして、それらの解説で頻繁に登場するのが「シーケンス」という言葉です。
「シーケンスって結局何?」 「リストとタプルの操作がごっちゃになる…」 「共通のルールがあるならまとめて知りたい!」
この記事は、そんな悩みを抱えるあなたのために書きました。
この記事を読めば、Pythonのシーケンスの基本的な考え方から、リスト・タプル・文字列に共通する便利な操作方法まで、まとめて理解できます。サンプルコードを交えながら分かりやすく解説していくので、ぜひ最後までお付き合いください。
Pythonのシーケンスとは?
Pythonのシーケンスとは、簡単に言うと順番(順序)が決められた要素の集まりのことです。複数のデータを一つの変数でまとめて管理するための「入れ物」のようなものだと考えてください。
複数の要素をまとめて管理する「入れ物」
シーケンスの最大の特徴は、格納されている各要素に「0番、1番、2番…」というように、先頭から順番に番号が振られていることです。この番号をインデックスと呼びます。このインデックスがあるおかげで、特定の要素をピンポイントで指定したり、一部分だけを取り出したりといった操作が簡単に行えます。
代表的なシーケンス型:リスト、タプル、文字列
Pythonには、標準でいくつかのシーケンス型が組み込まれていますが、特に重要なのが以下の3つです。
- リスト (list):
[10, 20, 30]のように[]で囲む。要素の変更が可能。 - タプル (tuple):
(10, 20, 30)のように()で囲む。一度作成すると要素の変更が不可能。 - 文字列 (str):
"hello"や'world'のように""や''で囲む。文字のシーケンス(連なり)。
これらは見た目や性質が少しずつ異なりますが、「シーケンス」という大きなグループに属しているため、これから紹介する多くの操作を共通して行うことができます。
これだけは覚えたい!シーケンスの7つの共通操作
ここからは、リスト、タプル、文字列のすべてに共通して使える基本的な操作を見ていきましょう。一度覚えれば様々な場面で応用が効くので、しっかりマスターしましょう。
① インデックスを使った要素へのアクセス
シーケンス[インデックス] の形式で、指定した位置の要素を1つだけ取り出せます。インデックスは0から始まることに注意してください。
# リスト
my_list = ['apple', 'banana', 'cherry']
print(my_list[0]) # 出力: apple
print(my_list[1]) # 出力: banana
# タプル
my_tuple = (10, 20, 30)
print(my_tuple[2]) # 出力: 30
# 文字列
my_string = "Python"
print(my_string[3]) # 出力: h② スライスを使った一部分の取り出し
スライス シーケンス[開始:終了] を使うと、指定した範囲の要素をまとめて取り出せます。終了の位置の要素は含まれないのがポイントです。
# リスト
my_list = ['a', 'b', 'c', 'd', 'e']
print(my_list[1:4]) # 1番から4番の手前まで -> ['b', 'c', 'd']
# 文字列
my_string = "HelloWorld"
print(my_string[0:5]) # 0番から5番の手前まで -> Hello
# 開始や終了を省略すると、それぞれ最初から、最後までを意味します
print(my_string[:5]) # 最初から5番の手前まで -> Hello
print(my_string[5:]) # 5番から最後まで -> World③ len() による要素数の取得
len() 関数を使うと、シーケンスに含まれる要素の数を簡単に取得できます。
my_list = [1, 2, 3, 4, 5]
print(len(my_list)) # 出力: 5
my_string = "Tokyo"
print(len(my_string)) # 出力: 5④ in 演算子による要素の存在確認
要素 in シーケンス という書き方で、特定の要素がシーケンス内に存在するかどうかを True / False で確認できます。
my_list = ['apple', 'banana', 'cherry']
print('banana' in my_list) # 出力: True
print('orange' in my_list) # 出力: False
my_string = "Python"
print('P' in my_string) # 出力: True
print('z' in my_string) # 出力: False⑤ + 演算子による連結
+ 演算子を使うと、同じ種類のシーケンス同士を連結して、新しいシーケンスを作成できます。
list_a = [1, 2, 3]
list_b = [4, 5, 6]
print(list_a + list_b) # 出力: [1, 2, 3, 4, 5, 6]
str_a = "Hello"
str_b = " World"
print(str_a + str_b) # 出力: Hello World⑥ * 演算子による繰り返し
* 演算子を使うと、シーケンスを指定した回数だけ繰り返した、新しいシーケンスを作成できます。
my_list = [1, 2]
print(my_list * 3) # 出力: [1, 2, 1, 2, 1, 2]
my_string = "Go"
print(my_string * 4) # 出力: GoGoGoGo⑦ for文による繰り返し処理
for文と組み合わせることで、シーケンスの要素を先頭から一つずつ取り出して処理を実行できます。これはPythonで最もよく使われる処理の一つです。
# リストの各要素を出力
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)
# 出力:
# apple
# banana
# cherry
# 文字列の各文字を出力
for char in "Python":
print(char)
# 出力:
# P
# y
# t
# h
# o
# nシーケンスで重要な「ミュータブル」と「イミュータブル」の違い
シーケンスを使いこなす上で非常に重要なのが、「ミュータブル(mutable)」と「イミュータブル(immutable)」の違いです。これは「作成後に中身を変更できるか、できないか」を意味します。
ミュータブル(変更可能)なシーケンス:リスト (list)
リストはミュータブルなオブジェクトです。つまり、一度作成した後でも、インデックスを指定して要素を書き換えたり、要素を追加・削除したりできます。
my_list = [10, 20, 30]
print(my_list) # 出力: [10, 20, 30]
# インデックスを指定して要素を書き換える
my_list[1] = 99
print(my_list) # 出力: [10, 99, 30]
# append()メソッドで末尾に要素を追加する
my_list.append(40)
print(my_list) # 出力: [10, 99, 30, 40]イミュータブル(変更不可能)なシーケンス:タプル (tuple), 文字列 (str)
一方、タプルと文字列はイミュータブルです。一度作成すると、その中身を変更することはできません。要素を変更しようとするとエラーが発生します。
# タプルの要素を変更しようとするとエラーになる
my_tuple = (10, 20, 30)
# my_tuple[1] = 99 # この行を実行すると TypeError が発生!
# 文字列の文字を変更しようとしてもエラーになる
my_string = "Python"
# my_string[0] = "J" # この行を実行すると TypeError が発生!データを勝手に書き換えられたくない場合や、定数として扱いたい場合にはタプルを、柔軟にデータを変更したい場合にはリストを使う、といった使い分けが重要になります。
まとめ:シーケンスを制する者はPythonの基本を制す
今回は、Pythonにおけるシーケンスの基本について解説しました。
- シーケンスは、順番を持つ要素の集まり。
- リスト、タプル、文字列が代表的なシーケンス型。
- インデックス参照、スライス、len() など、多くの便利な操作が共通して使える。
- for文と組み合わせることで、繰り返し処理を簡単に書ける。
- 変更可能な**ミュータブル(リスト)と、変更不可能なイミュータブル(タプル、文字列)**の違いを意識することが重要。
シーケンスの概念と共通操作を理解することは、Pythonプログラミングの土台を固める上で非常に大切です。この記事を参考に、ぜひ色々なシーケンスを実際にコードで触ってみてください。


コメント