0-20ではリスト内包表記を学びました。今回は Python に標準で用意されている便利な組み込み関数を使いこなす方法を学びます。

まずはPycoBlocksを開こう
下のPycoBlocksで直接作業するか、別タブで開き、生成されるPythonコードを見ながら進めてください。
| 関数 | 用途 | 例 |
|---|---|---|
enumerate | インデックスと値を同時に取得 | for i, v in enumerate(lst) |
zip | 複数のリストを並列に処理 | for a, b in zip(lst1, lst2) |
map | 各要素に関数を適用 | list(map(str, nums)) |
filter | 条件に合う要素だけ取り出す | list(filter(func, lst)) |
sorted | 新しいソート済みリストを返す | sorted(lst, reverse=True) |
ステップ1:enumerate でインデックス付きループ
リストをループするとき、要素と同時に番号が必要な場面は多い。enumerate を使えば手動でカウンタ変数を管理せずに済みます。PycoBlocks では py_enumerate_for ブロック(for 変数, 変数 in enumerate(リスト):)と py_enumerate_start_for ブロック(開始番号を指定)を使います。

fruits = ["apple", "banana", "cherry"]
# enumerate(インデックスと値を同時に取得)
for i, f in enumerate(fruits):
print(f"{i}: {f}")
# 開始番号を 1 に変える
for i, f in enumerate(fruits, start=1):
print(f"{i}番目: {f}")
ステップ2:zip で複数リストを並列処理
zip は複数のリストを「横に並べて」同時にループします。長さが異なる場合は短い方に合わせて止まります。PycoBlocks では py_zip_for ブロック(for 変数, 変数 in zip(リスト, リスト):)を使います。

names = ["田中", "鈴木", "山田"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score}点")
ステップ3:map と filter
map は各要素に関数を適用し、filter は条件に合う要素だけを取り出す。どちらもイテレータを返すので list() で囲んで使うことが多い。PycoBlocks では型変換の map(例:list(map(int, リスト)))に py_map_call ブロックを使います。lambda を使った map・filter はコーディングモード(py_custom_expr)で書けます。

nums = [1, 2, 3, 4, 5]
# リスト内包表記で各要素を変換(map 相当)
squared = [x ** 2 for x in nums]
print(squared) # [1, 4, 9, 16, 25]
# 文字列リストを整数に変換(map ブロック)
str_nums = ["10", "20", "30"]
int_nums = list(map(int, str_nums))
print(int_nums) # [10, 20, 30]
# リスト内包表記で絞り込み(filter 相当)
evens = [x for x in nums if x % 2 == 0]
print(evens) # [2, 4]
ステップ4:sorted でカスタムソート
sorted は元のリストを変えずに並べ替えた新しいリストを返します。key 引数でソートの基準を指定できます。PycoBlocks では py_sorted_call ブロックで昇順・降順ソートができます。key= を使うソートはコーディングモード(py_custom_expr)で書けます。

words = ["banana", "apple", "cherry", "date"]
# アルファベット順
print(sorted(words))
# 文字数(len)順
print(sorted(words, key=len))
# 逆順
print(sorted(words, reverse=True))
コーディングモードで書いてみよう
# enumerate + zip を組み合わせる
headers = ["名前", "点数", "順位"]
data = ["田中", 85, 2]
for i, (h, d) in enumerate(zip(headers, data), start=1):
print(f"{i}. {h}: {d}")
# any・all(よく使う組み込み関数)
nums = [1, 3, 5, 7, 9]
print(any(n % 2 == 0 for n in nums)) # False(偶数が1つもない)
print(all(n > 0 for n in nums)) # True(全て正)
演習課題
課題21-1:順位付きで表示する
リスト ["Python", "Java", "C", "Ruby"] を enumerate を使って「1位: Python」のように表示するプログラムを書いてみましょう。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

langs = ["Python", "Java", "C", "Ruby"]
for rank, lang in enumerate(langs, start=1):
print(f"{rank}位: {lang}")
解説: start=1 を指定することで、インデックスが 0 ではなく 1 から始まります。
課題21-2:名前と点数を zip で表示
名前リスト ["Alice", "Bob", "Carol"] と点数リスト [88, 75, 92] を zip で結合し、「Alice: 88点」の形式で表示してください。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

names = ["Alice", "Bob", "Carol"]
scores = [88, 75, 92]
for name, score in zip(names, scores):
print(f"{name}: {score}点")
解説: zip を使うと2つのリストを対応付けながらループできます。
課題21-3:文字列リストを整数に変換
["5", "3", "8", "1", "9"] を map で整数のリストに変換し、合計を表示するプログラムを書いてみましょう。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

str_nums = ["5", "3", "8", "1", "9"]
int_nums = list(map(int, str_nums))
print("合計:", sum(int_nums)) # 合計: 26
解説: map(int, リスト) は各要素に int() を適用します。input().split() で入力を受け取った後の変換によく使います。
課題21-4:60点以上のみ取り出す
点数リスト [45, 72, 58, 88, 61, 34, 95] から filter を使って60点以上の点数だけを取り出せ。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

scores = [45, 72, 58, 88, 61, 34, 95]
passing = list(filter(lambda s: s >= 60, scores))
print(passing) # [72, 88, 61, 95]
解説: PycoBlocksではリスト内包表記 [s for s in scores if s >= 60] を使ってフィルタリングします。これは list(filter(lambda s: s >= 60, scores)) と全く同じ結果になります。filter の書き方もPythonらしいコードとして覚えておきましょう。
課題21-5:辞書リストを複数キーでソート
以下のリストを「クラス昇順、点数降順」で並べ替えて表示するプログラムを書いてみましょう。
students = [
{"name": "田中", "class": "A", "score": 85},
{"name": "鈴木", "class": "B", "score": 92},
{"name": "山田", "class": "A", "score": 78},
{"name": "伊藤", "class": "B", "score": 88},
]
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

students = [
{"name": "田中", "class": "A", "score": 85},
{"name": "鈴木", "class": "B", "score": 92},
{"name": "山田", "class": "A", "score": 78},
{"name": "伊藤", "class": "B", "score": 88},
]
result = sorted(students, key=lambda _s: (_s["class"], -_s["score"]))
for s in result:
print(s["class"], s["name"], s["score"], "点")
解説: key にタプルを返すラムダ式を渡すと複数キーでソートできます。点数を -s["score"] にすると降順になります。
まとめ
enumerate(lst, start=1)でインデックスと値を同時に取得できますzip(a, b)で複数リストを並列にループできますmap(func, lst)で各要素に関数を適用できますfilter(func, lst)で条件に合う要素だけ取り出せますsorted(lst, key=..., reverse=True)でカスタムソートができますany・allも合わせて覚えておくと便利です
次は「ファイルの読み書き」を学びます。→ Python × 入門 | #22 ファイルを読み書きしよう