データ構造
Python
list・dict・set・tuple・comprehension
リスト(list)
可変シーケンス・スライス・メソッド
# 作成
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)
キーと値のマッピング・操作パターン
# 作成
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)]セット・タプル
集合演算とイミュータブルシーケンス
# セット(重複なし・順序なし)
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
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]