Python × 入門 | #21 便利な組み込み関数

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 ブロック(開始番号を指定)を使います。

enumerate を使った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(リスト, リスト):)を使います。

zip を使ったforループのブロック例
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)で書けます。

map・filter のブロック例
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)で書けます。

sorted でカスタムソートするブロック例
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」のように表示するプログラムを書いてみましょう。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

enumerateで連番付きforを使うブロック例
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点」の形式で表示してください。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

zipで名前とスコアを対応付けるブロック例
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 で整数のリストに変換し、合計を表示するプログラムを書いてみましょう。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

mapでstr→int変換して合計するブロック例
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点以上の点数だけを取り出せ。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

リスト内包表記で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},
]
▶ 模範解答と解説を見る

ブロックの組み合わせ例:

sortedで辞書リストをクラス昇順・スコア降順に並べるブロック例
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) でカスタムソートができます
  • anyall も合わせて覚えておくと便利です

次は「ファイルの読み書き」を学びます。→ Python × 入門 | #22 ファイルを読み書きしよう

PAGE TOP