スキルアップ

Python入門:コンテナでのデータ構造についての基礎

はじめに

プログラミング学習を進めていくと、
次に出てくる大きなステップが
複数のデータをまとめて扱う方法」です。

今まで学んでいた基本の変数や文字列は
「1つずつの値を扱う」のに適していますが、
現実的な用途では大量のデータを管理する必要が出てきます。

そこで登場するのが、

  • リスト
  • タプル
  • ディクショナリ
  • セット

と呼ばれるコンテナ(データ構造)です。

これらは、関連する複数の値をまとめて、
一つのまとまりとして扱えるように設計されています。

Pythonでのコンテナは扱いやすく、
非常に直感的に操作できることが特徴です。

  • リスト
    順序を保つデータの集合で、
    追加・変更・削除が自在
  • タプル
    変更不可なリストとして使え、
    固定データに便利
  • ディクショナリ
    キーと値のペアで管理できる辞書型
  • セット
    重複なしの集合で、
    重複排除や集合演算に強い

この記事では、各コレクション型の特徴や使い方を
整理し、それぞれを章に分けてまとめます。

この記事はこんな方におすすめです!

  • Python学びたいと思っている方
  • リスト・タプル・辞書・セットの違いや
    使い分けに悩んでいる方
  • forループや条件分岐でデータを処理する前に、
    コンテナ型を理解したい方
  • 実用的なデータ構造を学んで、
    ツール開発や副業準備に活かしたい方


第1章:Pythonのコンテナとは

コンテナ(データ構造)とは、
複数の値を1つの変数にまとめて格納できるデータ型の総称です

これは、実際の箱のように
「複数のもの(値)を中に入れておける」というイメージで、
名前の通り「コンテナ=容器」の役割を果たします。

たとえば、複数の数字や文字列、オブジェクトを
個別に変数に格納していくと、
次のように変数が増えてしまいます。

name1 = "Alice"
name2 = "Bob"
name3 = "Charlie"

ですが、コンテナ(この場合はリスト)を使えば、
一つの変数にすべてまとめられます。

names = ["Alice", "Bob", "Charlie"]

これにより、データの管理や処理が圧倒的に楽になります。

このように、
複数の値を扱うときは、まずコンテナ型の利用を考える
というのが、プログラミングにおける基本的な考え方です。

Pythonでは、次のような代表的な種類があります。

  • リスト(list):順序付きで変更可能
  • タプル(tuple):順序付きで変更不可
  • ディクショナリ(dict):キーと値のペアで管理
  • セット(set):順序なし、重複なしの集合

コンテナの役割と利点

コンテナを使うことで、以下のようなことが可能になります。

  • 繰り返し処理(for文など)でまとめて操作
  • インデックスやキーを使って
    目的のデータをすばやく取り出せる
  • 並び替え、追加、削除、検索などの
    操作がしやすくなる
  • 複数のデータを一括で
    渡す・返す
    ような処理にも便利

また、Pythonではこれらのコンテナが
非常に使いやすく設計されており、
直感的なコードで強力な処理が実現できます。


各コンテナの概要比較

コンテナ特徴主な用途の例
list順序付き・変更可掲示板投稿のリスト、
処理待ちタスクなど
tuple順序付き・変更不可日付情報、
定数データなど
dictキーで値を管理設定値、
ユーザー情報など
set順序なし・重複なし出現文字種類の集計、
タグ管理

それぞれの用途に応じて最適な選択をすることで、
コードが読みやすく、バグにも強くなる
というメリットがあります。

  • リストは順序や並び替えが大切なときに
  • タプルは誤って書き換えたくない値に
  • 辞書はキーによって高速に特定の値へ
    アクセスしたいときに
  • セットは重複を排除したり集合演算を行うときに

コンテナの相互変換

また各コンテナはそれぞれ相互での変換が可能です。

例えば、セットをリストに変換したり、
リストをタプルに変えることで、用途に応じた加工が可能です。

numbers = [1, 2, 2, 3]
unique = set(numbers)        # {1, 2, 3}
unique_list = list(unique)   # [1, 2, 3]
final_tuple = tuple(unique_list)
print(type(numbers), type(unique), type(final_tuple))
# → list set tuple

このように、コンテナ間を相互に変換して
使い分ける流れ
については、
後の章でも詳しく紹介していきます。


第2章:リスト(list)の使い方

リストは、「順序付きで値をまとめて管理できるコンテナ」です。

角かっこ [] で宣言し、
要素の追加・更新・削除が自由に行えます。

fruits = ["apple", "banana", "cherry"] #リストの宣言
fruits.append("peach")  #要素の追加
fuits[0] = pine         #要素の変更
fruits.remove("cherry") #要素の削除
print(fruits)           # ['pine', 'banana', 'peach']

要素の追加について

append()での末尾追加を基本として、
リストでは要素の追加に以下の方法もあります。

  • append():末尾へ追加
  • insert(index, value):指定位置に挿入
  • extend():他のリストをまとめて追加
fruits = ["apple", "banana"] #リストの宣言
fruits.append("date")
fruits.insert(1, "blueberry")  
fruits.extend(["elderberry", "fig"])
print(fruits)
# → ["apple", "blueberry", "banana", "date", "elderberry", "fig"]

要素の更新と削除

個別の要素は fruits[index] = new_value で上書き可能。
indexはリスト内の要素の位置を指定するもので0から始まります。

要素を削除する場合、
remove(value)pop(index)del キーワードでも
削除可能です。

fruits = ["apple", "banana", "cherry", "date] #リスト宣言
fruits[0] = "apricot"
fruits.remove("date")
last = fruits.pop()      # 最後の要素を取り出して削除
del fruits[1]            # インデックス指定で削除
print(fruits) #["apricot"]

インデックス指定とスライス範囲指定

  • インデックス指定
    fruits[2] → 第3要素(0始まり)
  • 負数インデックス
    fruits[-1] → 末尾の要素
  • スライス
    任意の範囲を別リストで取得
fruits = ["apple", "banana", "cherry", "date] #リスト宣言
subset = fruits[1:3]     # インデックス1〜2
print(fruits[:3])        # 最初の3つ
print(fruits[::2])       # ステップで間引き
print(fruits[-3:])       # 最後の3つ

リストを使ったスタック&キュー操作

  • スタック(LIFO)
    append()で積み上げ、pop()で取り出し
  • キュー(FIFO)
    append()で追加、pop(0)または
    popleft()で取り出し
stack = []
stack.append("A"); stack.append("B")
stack.pop()              # 'B' が消える

queue = []
queue.append("X"); queue.append("Y")
queue.pop(0)             # 'X' が消える

リスト内包表記

リスト内包表記とは、
リスト同士の変換や条件フィルタを簡潔に書く方法です。

書き方としては、
[ 式(返却値) for 変数 in 反復構造体 ブロック処理 ]
となります。

nums = [1, 2, 3, 4, 5]
squares = [n * n for n in nums]
#[1, 4, 9, 16, 25]
evens = [n for n in nums if n % 2 == 0]
#[2, 4]

非常に簡潔に記述でき、
ディクショナリやセットの内包表記にも応用できます。


メソッド・属性のまとめ

操作メソッド
追加append(), extend(), insert()
更新インデックス指定
削除remove(), pop(), del
添字指定list[index]
スライスlist[start:stop:step]
長さ取得len(list)
空チェックif not list:

第3章:ディクショナリ(dict)の使い方

ディクショナリは、
キーと値のペアを格納するコンテナで、
順序付き(Python 3.7以降)かつ変更可能です。

波括弧 {} で作成し、key: value の形式で宣言します。

scores = {"Alice": 85, "Bob": 92}
print(scores)  # {'Alice': 85, 'Bob': 92}

キーはイミュータブル(変更できない型)でなければならず、
値は任意の型を入れられます。

使いどころと実用例として、

  • 設定ファイルの読み込み
    キーで属性を保持
  • ユーザー情報管理
    ID → ユーザーデータのマッピング
  • 高速検索
    キーで O(1) アクセス可能

要素の追加・更新・削除

単一のキーを追加、または更新するには、
代入演算子を使います。

scores = {"Alice": 85, "Bob": 92}
scores["Charlie"] = 78      # 追加
scores["Alice"] = 90        # 更新

または update()|= 演算子でも可能です。
update() は便利で、複数のキーを一気に追加・更新できます。

scores = {"Alice": 85, "Bob": 92}scores.update({"Bob": 95, "Dave": 88})
scores |= {"Eve": 75}       # Python 3.9+

要素を削除するには以下の方法があります。

  • del scores["Bob"]
    キーで指定して削除
  • scores.pop("Charlie")
    値を取り出して削除
  • scores.popitem()
    最新挿入のペアを削除
  • scores.clear()
    全削除

例えば、

scores = {"Charlie": 85, "Bob": 92}
del scores["Bob"]
removed = scores.pop("Charlie", None)
print(removed) #85

キーの重複時の挙動

ディクショナリではキーの重複は許されていません。

もし、同じキーが複数回指定されると最後の値で上書きされます。

d = {"x": 1, "y": 2, "x": 3}
print(d)  # {'x': 3, 'y': 2}

このため、「最後に指定したものが有効」
という点を意識しましょう。


主なメソッドと操作

操作メソッドや方法
キーの存在"Alice" in scores
全キー取得scores.keys()
全値取得scores.values()
ペア取得scores.items()
安全取得scores.get("Frank", default)
初期化付き取得scores.setdefault("Frank", 0)

第4章:タプル(tuple)の使い方

タプルは「順序付き」で
「一度作成すると内容を変更できない」コンテナです。

小括弧 ()カンマのみ で定義できます。

empty = () # 空のタプル 
coords = (10, 20, 30) # 小括弧付き 
colors = "red", "green", "blue" # 小括弧省略もOK

Pythonでは
ミュータブル(変更可)とイミュータブル(変更不可)
の線引きが重要で、タプルは変更不可(immutable)型です

一度定義すると中身を変えられません。

実用例と注意点として、

  • 定数や設定ファイル、座標値など、
    内容を固定しておきたいデータに利用する
  • 複数値をまとめて返す関数の 戻り値 としての活用
  • 要素数が増減しないからこそ、
    副作用の少ないデータ伝搬が可能

要素が1つだけのタプルの注意点

要素が 1つのタプルを作るときは、カンマが必須です。

single = (10,) # タプル 
not_tuple = (10) # int になります

カンマがないと単なるスカラー(単一データ型)
として扱われるので注意しましょう。


イミュータブル(不変)であるメリット

  • 誤って上書きされない安心感
  • ディクショナリ(dict)のキーとして使える
    キーに要求される不変性をクリアできる
  • パフォーマンス向上
    コンパクトに設計され、
    高速アクセスが期待できる

リストとの違いと使い分け

特性リスト(list)タプル(tuple)
変更可否ミュータブルイミュータブル
用途データを加工・更新する用途定数や固定データ向き
要素追加・削除×
辞書のキーに可能×
  • リスト:
    後から要素の追加・変更・削除
  • タプル:
    定義後は読み取り専用で、
    固定データや関数の返り値などに適している

第5章:セット(set)の使い方と集合演算

セット(set)は「順序なし」かつ
「重複を許さない」コンテナです。

波括弧 {} または set() で生成しますが、
空のセットはset()が必須({}は辞書になります)。

s = {1, 2, 3}
print(s, type(s))  # {1, 2, 3} <class 'set'>
empty = set()

順序を持たないため、インデックスでのアクセスはできません。
また、重複を許可していないため、
同じ値を複数回追加しても一つのみ保持されます。

実用例と注意点として、

  • タグ管理
    重複しないユーザータグをセットで管理
  • 集合演算処理
    複数の条件に合うデータの抽出(共通要素など)
  • 重複排除処理
    CSVから重複する項目を一括で削除
  • 順序不保証
    出力に順序が求められるときは事前に
    sorted() などで
    並べ替えて使用する必要がある

要素の追加・削除

s = {"apple", "banana"}
s.add("cherry")             # 要素追加
s.update(["date", "fig"])   # 複数要素をまとめて追加
s.remove("banana")          # 削除(無いとKeyError)
x = s.discard("not_exist")  # 存在しなくてもエラーにならない
y = s.pop()                 # 任意の要素を取り出して削除
  • discard は、存在しない値の削除で
    例外を発生させない点が便利です。
  • pop() は内容順序が保証されないため、
    ランダムな要素が削除されます

重複と順序に関する特性

同じ値を何度追加しても、
集合内で一意の値だけが保持されるため、
リストやタプルからセットを作ることで、
重複の排除が簡単に可能。

しかし、要素の取得の順序が保証されないため、
要素の並びをあてにした処理はできません
(ソートする必要あり)。

s = {1,2,2,3,3,3}
print(s)  # {1, 2, 3}

集合演算の活用

セットならではの演算で、数学的な集合操作が可能です。

複数の集合に対する演算子として、

  • 和集合:| または union()
  • 積集合:& または intersection()
  • 差集合:- または difference()
  • 対称差:^ または symmetric_difference()
a = {1,2,3,4}
b = {3,4,5,6}

print(a | b)  # 和集合 {1,2,3,4,5,6}
print(a & b)  # 積集合 {3,4}
print(a - b)  # 差集合 {1,2}
print(a ^ b)  # 対称差 {1,2,5,6}

集合演算は、タグの共通性や差分、
重複検出といった場面で重宝します。


第6章:コンテナの相互変換

コンテナ型は、それぞれ得意な用途がありますが、
適宜変換して使い分けることでより柔軟な処理が可能になります。

ここでは、その変換の方法とシチュエーションを整理します。


型変換の基本関数

Pythonには、
以下のような型変換関数が標準で用意されています。

list(iterable)   # 任意の反復可能オブジェクトからリストを生成
tuple(iterable)  # タプルを生成
set(iterable)    # セットを生成(重複排除も同時)
dict(iterable)   # タプルのペアから辞書を生成

リスト⇄セット

リストからセットへ変換することで、
重複を排除できる上に、セットの演算も使えるようになります。

また、セットからリストに戻せば順序付きで処理できます。

nums = [1, 2, 2, 3, 3, 4]
unique = set(nums)        # {1, 2, 3, 4}
unique_list = list(unique)  # [1, 2, 3, 4](順序は作成時点では不定)

用途例:CSVデータやログに対して重複チェック。


リスト⇄タプル

リストとタプルの間は容易に変換でき、
編集可能な状態と固定状態を切り替える用途に便利です。

l = [10, 20, 30]
t = tuple(l)       # (10, 20, 30)
l2 = list(t)       # [10, 20, 30]

用途例:関数の返り値をタプルで渡し、必要に応じて編集する。


タプル⇄セット

タプルもセットと変換可能です。
タプルの重複を排除したい場合や、
セットから不変なコレクションに戻したいときに活用できます。

t = (1, 2, 2, 3)
s = set(t)         # {1, 2, 3}
t2 = tuple(s)      # (1, 2, 3)

リスト⇄ディクショナリ(キ―と値のセット)

ディクショナリへの変換は少し特殊で、
キー:値のペアが要素のイテラブルである必要があります。 

keys = ["a", "b", "c"]
values = [1, 2, 3]
d = dict(zip(keys, values))  # {'a':1, 'b':2, 'c':3}

# 辞書のキー一覧だけを取得する場合
key_list = list(d)   # ['a', 'b', 'c']
# ディクショナリの値一覧を取得する場合
val_list = list(d.values()) # [1, 2, 3]

用途例:フォーム入力と値を組み合わせて辞書にまとめる。


ディクショナリの項目⇄リスト・タプル

辞書からキー・値・ペアを取り出す方法もあります。

d = {"x": 10, "y": 20}

keys = list(d.keys())     # ['x', 'y']
vals = list(d.values())   # [10, 20]
items = list(d.items())   # [('x',10), ('y',20)]

# ペアのリストから辞書に戻す
d2 = dict(items)

第7章:まとめ & 次回予告

今回は、Pythonのコンテナ型
「リスト・タプル・ディクショナリ・セット」について学び、
それぞれの特徴・使い方・違い・相互変換まで
幅広く整理しました。

これらのデータ構造を使いこなすことで、
複雑な情報を整理しやすくなり、
実務や副業案件でのコーディングにも対応しやすくなります

特に、内包表記や集合演算などは、
実装の効率化にもつながる非常に強力な武器となります。

「この場面ではどのコンテナ型が適しているか?」
を意識することで、
コードの読みやすさや拡張性が大きく向上します。

次回は、プログラミングのロジック構築に欠かせない
「条件分岐(if文)」 について解説していきます。

「データに応じて処理を分けたい」という
実際のアプリケーション開発や自動化処理で不可欠な考え方。

複数の条件に応じた動作をさせることで、
よりインタラクティブで柔軟なプログラム
が書けるようになります。

▶次回の記事はこちら:
[現在準備中です!少々お待ちください!]

-スキルアップ