🐍

精読「独習Python」(標準ライブラリ コレクション)

2024/12/29に公開



独習Python
「独習Python」は、初心者から中級者までを対象に、Pythonの基礎から応用までを体系的に学べる入門書で、豊富な例題と練習問題を通じて実践的なスキルを身につけられる一冊です。

関連記事

複数の値を束ねるための仕組みを持つものの総称としてコレクションコンテナー)と呼ぶ。

シーケンス型

シーケンス型に分類される型には、リストlist)、タプルtuple)、レンジrange)がある。

リストの生成

# 初期値を持つリスト
numbers = [1, 2, 3, 4]
# リストコンストラクターで生成(タプル/セット等の型をリストに変換するときに利用)
fruits = list({'apple','banana','orange'})
# リスト内包表記で生成
squares = [x**2 for x in range(5)]

リストから特定範囲の要素を取得する

numbers = [10, 20, 30, 40, 50]
subset = numbers[1:4]  # [20, 30, 40]

リストの要素数を取得する

numbers = [1, 2, 3]
length = len(numbers)  # 3

リストに要素を追加/削除する

numbers = [1, 2, 3]
numbers.append(4)  # [1, 2, 3, 4]
numbers.pop()      # [1, 2, 3]

リスト内の要素を削除する

numbers = [1, 2, 3, 4]
numbers.remove(3)  # [1, 2, 4]

複数要素を追加/置換/削除する

numbers = [1, 2, 3, 4]
numbers[1:3] = [20, 30]  # [1, 20, 30, 4]

リストを検索する

numbers = [1, 2, 3, 4]
index = numbers.index(3)  # 2
exists = 5 in numbers     # False

リストを複製する

original = [1, 2, 3]
copy = original[:]  # [1, 2, 3]

リストを連結する

list1 = [1, 2]
list2 = [3, 4]
combined = list1 + list2  # [1, 2, 3, 4]

リストの内容を並べる

numbers = [4, 2, 3, 1]
numbers.sort()     # 昇順: [1, 2, 3, 4]
numbers.sort(reverse=True)  # 降順: [4, 3, 2, 1]

リストをforループで処理する方法

numbers = [1, 2, 3]
for num in numbers:
    print(num)

リスト内の要素がTrueであるかを判定する

numbers = [0, 1, 2]
all_non_zero = all(numbers)  # False
any_non_zero = any(numbers)  # True

リスト内の要素を加工する

numbers = [1, 2, 3]
doubled = [x * 2 for x in numbers]  # [2, 4, 6]

リストの内容を特定の条件で絞り込む

numbers = [1, 2, 3, 4, 5]
filtered = [x for x in numbers if x % 2 == 0]  # [2, 4]

リスト内の要素を順に処理して1つにまとめる

from functools import reduce

numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)  # 24

キュー構造を実装する

from collections import deque

queue = deque([1, 2, 3])
queue.append(4)   # エンキュー: [1, 2, 3, 4]
queue.popleft()   # デキュー: [2, 3, 4]

イミュータブルなリストを生成する

listとよく似た型として、タプル(tuple)という型もあり、タプルは変更できないリスト

from collections import namedtuple

ImmutableList = tuple([1, 2, 3])  # (1, 2, 3)

セット(集合)型

数学における集合の概念にも似ていて、ある要素がセットに含まれているか、他のセットとの包含関係に関係があるような状況でよく利用する

セットの生成

# リテラルを利用
fruit_set = {"apple", "banana", "cherry"}

# setコンストラクター
fruit_set = set(["apple", "banana", "cherry"])

# 入れ子(内側のセットはfrozensetでなければならない)
fruit_set = {"apple", "banana", frozenset(["cherry","remon"])}

セットの基本操作

fruit_set = {"apple", "banana", "cherry"}

fruit_set.add("banana")    # 追加(重複により無理される)
fruit_set.remove("remon")  # 削除

for item in fruit_set:     # ループ
    print(item)

print(fruit_set.pop())     # 取り出し(ランダム)
fruit_set.clear()          # 破棄

要素の有無/包含関係を判定する

一般的にセットを利用するのは、ある値がすでに存在するか、または、あるセットが別のセットに含まれているか(=サブセットであるか)など、集合関係に関心がある場合になる

# セットの定義
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

# 要素の有無
print(2 in set_a)  # True
print(7 not in set_b)  # True

# 包含関係
print(set_a.issubset(set_b))  # False
print(set_a.issuperset({1, 2}))  # True
print(set_a.isdisjoint(set_b))  # False (共通の要素 3, 4 が存在する)

和集合/差集合/積集合などを求める

# セットの定義
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

# 和集合
print(set_a | set_b)          # 演算子を使用: {1, 2, 3, 4, 5, 6}
print(set_a.union(set_b))     # メソッドを使用: {1, 2, 3, 4, 5, 6}

# 差集合
print(set_a - set_b)          # 演算子を使用: {1, 2}
print(set_a.difference(set_b))  # メソッドを使用: {1, 2}

# 積集合
print(set_a & set_b)          # 演算子を使用: {3, 4}
print(set_a.intersection(set_b))  # メソッドを使用: {3, 4}

# 対称差集合
print(set_a ^ set_b)          # 演算子を使用: {1, 2, 5, 6}
print(set_a.symmetric_difference(set_b))  # メソッドを使用: {1, 2, 5, 6}


Python setの集合演算【和集合・積集合・差集合・対称差集合】より

セット内包表記

# セット内包表記
squared_set = {x**2 for x in range(1, 6)}
print(squared_set)  # {1, 4, 9, 16, 25}

辞書(dict)型

一意のキーのペアで管理されるデータ構造(言語によっては、ハッシュ連想配列と呼ぶ)

辞書の生成

# リテラルを使用
my_dict1 = {"a": 1, "b": 2, "c": 3}
print(my_dict1)  # {'a': 1, 'b': 2, 'c': 3}

# dict() を使用
my_dict2 = dict(a=1, b=2, c=3)
print(my_dict2)  # {'a': 1, 'b': 2, 'c': 3}

# 空の辞書を生成して値を追加
my_dict3 = {}
my_dict3["a"] = 1
my_dict3["b"] = 2
print(my_dict3)  # {'a': 1, 'b': 2}

# zip() を使用してリストから辞書を生成
keys = ["a", "b", "c"]
values = [1, 2, 3]
my_dict5 = dict(zip(keys, values))
print(my_dict5)  # {'a': 1, 'b': 2, 'c': 3}

# fromkeys() を使用して既定値を持つ辞書を生成
keys = ["a", "b", "c"]
my_dict6 = dict.fromkeys(keys, 0)
print(my_dict6)  # {'a': 0, 'b': 0, 'c': 0}

# ネストした辞書
nested_dict = {
    "user1": {"name": "Alice", "age": 30},
    "user2": {"name": "Bob", "age": 25},
}
print(nested_dict)
# {'user1': {'name': 'Alice', 'age': 30}, 'user2': {'name': 'Bob', 'age': 25}}

# 辞書の結合 (Python 3.9以降)
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged_dict = dict1 | dict2
print(merged_dict)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}

ハッシュ表とキーの注意点

辞書は、内部的にハッシュ表ハッシュテーブル)と呼ばれるリストを持つ

ハッシュテーブルより

そのため、キーはhashableハッシュ可能)な型でなければならない(int,str,bytes,tuple,frozenset等)

辞書の基本操作

# 辞書の作成
my_dict = {"a": 1, "b": 2, "c": 3}
print(my_dict)  # {'a': 1, 'b': 2, 'c': 3}

# 1. 値の取得
print(my_dict["a"])  # 1
print(my_dict.get("d", "Not Found"))  # キーが存在しない場合の既定値: 'Not Found'

# 2. 値の追加・更新
my_dict["d"] = 4  # 新しいキーを追加
my_dict["a"] = 10  # 既存のキーを更新
print(my_dict)  # {'a': 10, 'b': 2, 'c': 3, 'd': 4}

# 3. 値の削除
my_dict.pop("b")  # 指定キーを削除
print(my_dict)  # {'a': 10, 'c': 3, 'd': 4}

# 4. キー・値の確認
print("a" in my_dict)  # True
print("b" not in my_dict)  # True

# 5. 辞書の全キー・全値を取得
print(my_dict.keys())  # dict_keys(['a', 'c', 'd'])
print(my_dict.values())  # dict_values([10, 3, 4])
print(my_dict.items())  # dict_items([('a', 10), ('c', 3), ('d', 4)])

# 6. 辞書のコピー
copy_dict = my_dict.copy()
print(copy_dict)  # {'a': 10, 'c': 3, 'd': 4}

# 7. 辞書のマージ (Python 3.9以降)
new_dict = {"e": 5, "f": 6}
merged_dict = my_dict | new_dict
print(merged_dict)  # {'a': 10, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

# 8. 全要素の削除
my_dict.clear()
print(my_dict)  # {}

既定値を持つ辞書を定義する

既定値を持つ辞書を定義するには、collections.defaultdictを使用する。これにより、キーが存在しない場合に自動的に既定値を返す辞書を作成できる

使いどころとしては、集計処理デフォルトのコレクション(リストやセット)を持つ場合に便利

word_count = defaultdict(int)
words = ["apple", "banana", "apple", "orange", "banana", "apple"]
for word in words:
    word_count[word] += 1
print(word_count)  # {'apple': 3, 'banana': 2, 'orange': 1}

辞書内包表記

# 数値をキーにして、その二乗を値にする辞書
squared_dict = {x: x**2 for x in range(1, 6)}
print(squared_dict)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

参考

https://amzn.to/41RlbuT
https://dev.classmethod.jp/articles/python-set-operation-images/
https://monozukuri-c.com/python-set-operation/
https://ja.wikipedia.org/wiki/ハッシュテーブル

脚注
  1. インデックス/スライス構文によるアクセスはできない ↩︎

Discussion