Python

データ構造

Python

list・dict・set・tuple・comprehension

リスト(list)

可変シーケンス・スライス・メソッド

lists.py python
# 作成
nums = [1, 2, 3, 4, 5]
mixed = [1, 'two', 3.0, True]
empty = []
from_range = list(range(1, 6))  # [1,2,3,4,5]

# 追加・削除
nums.append(6)          # 末尾追加
nums.extend([7, 8])     # 複数追加
nums.insert(0, 0)       # 先頭に挿入
nums.pop()              # 末尾削除・返却
nums.pop(0)             # 先頭削除・返却
nums.remove(3)          # 値で削除(最初の1つ)
del nums[0]             # インデックスで削除
del nums[1:3]           # スライスで削除

# 検索・確認
3 in nums               # True
nums.index(3)           # 最初のインデックス
nums.count(3)           # 出現回数

# ソート
nums.sort()             # in-place 昇順
nums.sort(reverse=True) # in-place 降順
nums.sort(key=abs)      # キー関数
sorted(nums)            # 新しいリストを返す(非破壊)
nums.reverse()          # in-place 逆順
list(reversed(nums))    # 非破壊版

# コピー
copy1 = nums[:]         # シャローコピー
copy2 = nums.copy()     # シャローコピー
import copy
deep = copy.deepcopy(nums)  # ディープコピー

辞書(dict)

キーと値のマッピング・操作パターン

dicts.py python
# 作成
user = {'name': 'Alice', 'age': 30, 'active': True}
from_keys = dict.fromkeys(['a', 'b', 'c'], 0)  # {'a':0,'b':0,'c':0}

# アクセス
user['name']                  # 'Alice'(KeyError の可能性)
user.get('email')             # None(キーがなければデフォルト)
user.get('email', 'N/A')      # 'N/A'

# 更新
user['email'] = 'alice@example.com'  # 追加・更新
user.update({'age': 31, 'city': 'Tokyo'})  # 複数更新
user |= {'role': 'admin'}     # |= 演算子(Python 3.9+)

# 削除
del user['city']
value = user.pop('role')      # 削除して返却
user.pop('missing', None)     # キーがなくても安全

# イテレーション
for key in user:              # キーのみ
    ...
for val in user.values():     # 値のみ
    ...
for key, val in user.items(): # キーと値のペア
    print(f'{key}: {val}')

# マージ(非破壊)
merged = {**defaults, **overrides}  # 後が優先
merged = defaults | overrides       # Python 3.9+

# defaultdict・Counter
from collections import defaultdict, Counter

dd = defaultdict(list)
dd['key'].append(1)           # KeyError なし

counts = Counter('aabbccca')  # Counter({'a':4,'c':3,'b':2})
counts.most_common(2)         # [('a',4),('c',3)]

セット・タプル

集合演算とイミュータブルシーケンス

set-tuple.py python
# セット(重複なし・順序なし)
s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}

# 集合演算
s1 | s2    # 和集合: {1,2,3,4,5,6}
s1 & s2    # 積集合: {3,4}
s1 - s2    # 差集合: {1,2}
s1 ^ s2    # 対称差: {1,2,5,6}

# メソッド
s1.add(5)
s1.discard(10)    # 存在しなくてもエラーなし
s1.remove(10)     # なければ KeyError
3 in s1           # True(O(1) の高速検索)

# 重複削除のイディオム
unique = list(set([1,2,2,3,3,3]))  # [1,2,3](順序は非保証)

# frozenset(イミュータブルなセット)
fs = frozenset([1, 2, 3])  # 辞書のキーに使える

# タプル(イミュータブルリスト)
t = (1, 2, 3)
one = (1,)         # 要素1つのタプル(カンマ必須)

# アンパック
a, b, c = t
first, *rest = t   # first=1, rest=[2,3]
*init, last = t    # init=[1,2], last=3

# 名前付きタプル
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
p.x, p.y      # 3, 4
print(p)      # Point(x=3, y=4)

# typing.NamedTuple(型ヒント付き)
from typing import NamedTuple
class Point(NamedTuple):
    x: float
    y: float
    label: str = ''  # デフォルト値

内包表記

list・dict・set・generator comprehension

comprehensions.py python
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# リスト内包表記
squares = [x**2 for x in nums]              # [1,4,9,...,100]
evens   = [x for x in nums if x % 2 == 0]   # [2,4,6,8,10]
labeled = [f'item_{x}' for x in nums]

# 条件分岐(三項演算子)
tagged = ['偶数' if x % 2 == 0 else '奇数' for x in nums]

# ネスト
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
flat   = [x for row in matrix for x in row]  # フラット化

# 辞書内包表記
square_map = {x: x**2 for x in range(5)}    # {0:0, 1:1, 2:4, ...}
inverted   = {v: k for k, v in {'a':1,'b':2}.items()}
filtered   = {k: v for k, v in d.items() if v > 0}

# セット内包表記
unique_mods = {x % 3 for x in nums}         # {0, 1, 2}

# ジェネレーター式(メモリ効率が良い)
gen = (x**2 for x in range(1_000_000))      # 遅延評価
total = sum(x**2 for x in nums)             # 括弧不要
any(x > 5 for x in nums)                   # True
all(x > 0 for x in nums)                   # True

# walrus 演算子(:=)で内包表記内に代入
results = [y for x in nums if (y := x**2) > 25]  # [36,49,64,81,100]