Pythonの組み込みデータ構造を徹底解説|リスト・辞書・タプル・セットの基本と使い方
Pythonには、int(整数)、float(浮動小数点数)、complex(複素数)、str(文字列)、bool(真偽値)といったシンプルな組み込み型に加え、リスト(List)、辞書(Dict)、タプル(Tuple)、セット(Set)といった複合的な組み込みデータ構造が用意されています。
本記事では、これら4つの主要なデータ構造について、作成方法から要素へのアクセス、変更方法、そして便利なメソッドまで、サンプルコード付きで詳しく解説します。
リスト(List)とは
リストはPythonにおける代表的なデータ型の一つで、オブジェクトのコレクションです。順序があり(ordered)、ミュータブル(mutable:変更可能)であることが特徴で、要素は角括弧 [] を使って記述します。
リストの作成方法
my_list=["car","bus","truck"] print(my_list)
リストの要素へのアクセス
リストの要素には、インデックス番号を指定することでアクセスできます。インデックスは0から始まるため、以下の例では位置1(2番目)の要素が返されます。
my_list=["car","bus","truck"] print(my_list[1]) # 出力: bus
リストの値の変更方法
インデックス番号を使えば、既存の要素の値を簡単に変更できます。リストはミュータブルなため、この操作が可能です。
my_list=["car","bus","truck"] my_list[2] = "van" # 値は変更可能 print(my_list) # 出力: ['car', 'bus', 'van']
リストへのループ処理
for ループを使えば、リスト内のすべての要素に対して順番に処理を実行できます。
my_list=["car","bus","truck"] for x in my_list: print(x)
リストで使える主なメソッド
Pythonにはリストに対して使用できる組み込みメソッドが多数用意されています。よく使われるものを以下にまとめました。
| 番号 | メソッドと説明 |
|---|---|
| 1 | append() リストの末尾に要素を追加します。 |
| 2 | clear() リストからすべての要素を削除します。 |
| 3 | copy() リストのコピーを返します。 |
| 4 | count() 指定した値を持つ要素の個数を返します。 |
| 5 | extend() 別のリスト(または任意のイテラブル)の要素を、現在のリストの末尾に追加します。 |
| 6 | index() 指定した値を持つ最初の要素のインデックスを返します。 |
| 7 | insert() 指定した位置に要素を挿入します。 |
| 8 | pop() 指定した位置の要素を削除します。 |
| 9 | remove() 指定した値を持つ要素を削除します。 |
| 10 | reverse() リストの順序を反転させます。 |
| 11 | sort() リストをソート(並べ替え)します。 |
辞書(Dict)とは
辞書はキー(key)と値(value)のペアでデータを管理するデータ構造で、抽象データ型として実装されています。各キーには対応する値が関連付けられており、この仕組みから「連想配列(Associative Array)」とも呼ばれます。
辞書の大きな特徴は、要素が順序を持たないことです。そのため、要素へのアクセスは位置(インデックス)ではなく、キーを通じて行います。
辞書の使用例
>>> student = {"Aadrika":001, "Adwaita":009, "Sakya":011, "Sanj":022}
ここでは生徒の記録を辞書で管理しています。生徒の名前をキーとして使えば、対応する値に直接アクセスできます。
>>> student = {"Aadrika":001, "Adwaita":009, "Sakya":011, "Sanj":022}
>>> student["Adwaita"]
009
一見すると「Aadrika」が最初、「Adwaita」が2番目という順序があるように見えますが、実際の辞書には順序の概念がないため、出力結果が定義時の「元の順序」を反映しない場合があります。
辞書への要素の追加
新しいキーと値のペアは、次のように追加できます。
>>> student["Krishna"] = 111
>>> student
{'Aadrika': 1, 'Adwaita': 9, 'Sakya': 11, 'Sanj': 22, 'Krishna': 111}
まず空の辞書を作成し、その後、要素を一つずつ追加していく形で構築していきます。
タプル(Tuple)とは
タプルはPythonにおけるオブジェクトの集合で、要素はカンマ , で区切って表現します。一般的には丸括弧 () で囲みます。
タプルはインデックスによるアクセスの点ではリストと似ていますが、最大の違いはイミュータブル(immutable:変更不可能)であることです。また、タプルは比較可能かつハッシュ可能であるため、ソートが容易であり、Pythonの辞書ではタプルがキーとして使用されることもあります。
タプルの作成方法
my_tuple=("car","bus","truck")
print(my_tuple)
タプルの要素へのアクセス
リストと同様に、インデックス番号を参照してタプルの要素にアクセスできます。以下の例では位置1(2番目)の要素が返されます。
my_tuple=("car","bus","truck")
print(my_tuple[1])
# 出力: bus
タプルの値は変更できない
タプルは一度作成すると、その値を変更することができません。これはタプルがイミュータブルだからです。
my_tuple=("car","bus","truck")
my_tuple[1] = "van"
# 値は変更不可 → TypeError が発生する
タプルへのループ処理
for ループを使えば、タプルの要素を順番に処理できます。
my_tuple=("car","bus","truck")
for x in my_tuple:
print(x)
タプルで使えるメソッド
タプルで使用できる組み込みメソッドは count() と index() の2つだけです。
| count() | タプル内で指定した値が出現する回数を返します。 |
| index() | タプル内から指定した値を検索し、見つかった位置(インデックス)を返します。 |
セット(Set)とは
数学において集合(set)とは、互いに異なるオブジェクトの集まりのことです。例えば、2、4、6という3つの数値は、それぞれ単独では異なるオブジェクトですが、まとめて考えるとサイズ3の一つの集合 {2, 4, 6} を形成します。
Pythonのセットは非常に有用です。特定の要素がセットに存在するかどうかを高速にチェックできるよう最適化されているため、大量のデータから重複排除や存在確認を行う際に高いパフォーマンスを発揮します。
セットに対するさまざまな操作
セットのメソッド
1. add(x) メソッド: 要素がまだ存在しない場合、その要素をセットに追加します。
A = {"AA", "BB", "CC"}
A.add("DD")
# セットAに DD を追加
2. union(s) メソッド: 2つのセットの和集合を返します。和集合の演算には | 演算子も使用できます。
A = {"AA", "BB", "CC"}
B = {"MM", "NN"}
Z = A.union(B)
または
Z = A|B
# セットZはAとB両方の要素を持つ
3. intersection(s) メソッド: 2つのセットの積集合を返します。こちらも & 演算子を使用できます。
S = A.intersection(B) # セットSはAとBに共通する要素を持つ
4. difference(s) メソッド: 1つ目のセットには含まれるが、2つ目のセットには含まれない要素からなるセットを返します。ここでも - 演算子が使えます。
S = A.difference(B) または S = A - B # セットSはAにありBにはないすべての要素を持つ
5. clear() メソッド: セット全体を空にします。
B.clear() # セットBを空にする
セットで使える演算子
セットおよびフローズンセット(frozenset)では、以下の演算子がサポートされています。
| key in s | # keyがsに含まれているかの判定(包含チェック) |
| key not in s | # keyがsに含まれていないことの判定(非包含チェック) |
| s1 == s2 | # 2つのセットが等しいかどうか |
| s1 != s2 | # 2つのセットが等しくないかどうか |
| s1 <= s2 | # s1がs2の部分集合であるか(s1 < s2 なら真部分集合) |
| s1 >= s2 | # s1がs2の上位集合(スーパーセット)であるか |
| s1 > s2 | # s1がs2の真の上位集合であるか |
| s1 | s2 | # 2つのセットの和集合 |
| s1 & s2 | # 2つのセットの積集合 |
| s1 – s2 | # 1つ目のセットにはあり、2つ目にはない要素の集合(差集合) |
| s1 ˆ s2 | # どちらか一方のみに存在する要素の集合(対称差) |
-
Pythonでイミュータブル(不変)なデータ構造を実装する方法を徹底解説
はじめに:なぜ不変(イミュータブル)なデータ構造が必要なのか?並行処理やマルチスレッド環境のプログラミングでは、複数の処理が同時に同じデータへアクセスし、予期せぬ書き換えが発生するリスクがあります。イミュータブル(不変)なデータ構造を使えば、一度作成したデータが勝手に変更されることを防げるため、データの整合性を保つ上で非常に有効です。一方、リストのようなミュータブル(可変)なデータ構造は、いつでも自由に内容を変更できます。便利である反面、意図しない箇所から書き換えられてしまう危険性も抱えています。この記事では、Pythonにおける可変・不変データ構造の違いを、実際のコード例を交えながら段階的に
-
グラフ構造の隣接リスト(Adjacency List)とは?基本概念と実装方法を解説
グラフは代表的な非線形データ構造の一つです。頂点(ノード)でデータを表し、その頂点同士の関係を辺(エッジ)で表現します。グラフGは「頂点の集合V」と「辺の集合E」という2つの要素から構成され、G(V,E)という形式で表記されます。まずは具体例を見てみましょう。このグラフには5つの頂点と5つの辺が存在します。すべての辺には向きが定義されています。例として、頂点BとDを結ぶ辺に注目すると、始点はB、終点はDとなります。そのため、BからDへは移動できますが、逆にDからBへ移動することはできません。グラフは非線形であり、一定の規則性を持たない構造です。そのため、メモリ上でグラフを扱うには、目的に応じた