0Pricing
DSA Interview Prep · レッスン

内包表記と組み込み関数

リスト・辞書・集合の内包表記、map、filter、zip、enumerate、key関数を使うsortedで簡潔な解法を書きます。

「内包表記と組み込み関数」はCoddyKit上の無料DSA Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDSA Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DSA Interview Prepコースには全4レッスンが含まれています。

リスト内包表記:簡潔なフィルタリング

リスト内包表記を使うと、forループとappendの組み合わせを、[expr for item in iterable if condition]というすっきりした1行にできます。少し高速で、Pythonに慣れていることも伝わります。

# Traditional loop
squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)  # [1, 4, 9, 16, 25]

# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens)    # [0, 2, 4, 6, 8]

2Dグリッドのためのネストされた内包表記

ネストされた内包表記は2Dグリッドを作成する標準的な方法で、DPテーブルの準備に使います。[[0]*C]*Rは避けてください。すべての行で1つの内部リストを共有してしまいます。コードで修正方法を示します。

# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad)  # [[9,0,0],[9,0,0],[9,0,0]]  oops!

# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good)  # [[9,0,0],[0,0,0],[0,0,0]]

辞書内包表記と集合内包表記

辞書内包表記と集合内包表記では波括弧を使います。辞書には{k: v for ...}、集合には{expr for ...}と書きます。どちらもフィルタリングできるため、1行で変換や重複排除を行えます。

# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map)  # {1:1, 2:4, 3:9, 4:16, 5:25}

# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths)  # {3, 8}  (order varies)

ジェネレーター式:メモリ効率に優れた方法

内包表記を()で囲むと、値を1つずつ生成するジェネレーターになり、メモリを節約できます。巨大なシーケンスに対して、sum、max、または他の関数へそのまま渡せます。

# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])

# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total)  # 333332833333500000

# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd)  # True  (stops at 3)

map()とfilter():関数型スタイル

mapはすべての要素に関数を適用し、filterはテストに合格した要素だけを残します。どちらも遅延評価されるため、結果を見るにはlist()で囲んでください。多くの場合、内包表記のほうが分かりやすくなります。

nums = [1, 2, 3, 4, 5]

# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled)  # [2, 4, 6, 8, 10]

# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens)    # [2, 4]

# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens   = [n for n in nums if n % 2 == 0]

zip():シーケンスを組み合わせる

zipは2つのシーケンスを組み合わせ、短いほうの末尾で停止します。2つのリストを同時にループするための、すっきりした方法です。zip(*matrix)を使うテクニックで2Dリストを転置できます。コードで確認します。

keys   = ['a', 'b', 'c']
values = [1, 2, 3]

pairs = list(zip(keys, values))
print(pairs)  # [('a',1), ('b',2), ('c',3)]

# Build dict from two lists
d = dict(zip(keys, values))
print(d)      # {'a':1, 'b':2, 'c':3}

# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)  # [[1,4,7],[2,5,8],[3,6,9]]

enumerate():インデックスと値

enumerateを使うと、ループ中に(index, value)を取得できます。range(len(lst))よりも簡潔で、オフバイワンのミスも防げます。startオプションを使えば、1から数え始められます。

fruits = ['apple', 'banana', 'cherry']

# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple / 1 banana / 2 cherry

# Start from 1
for i, fruit in enumerate(fruits, 1):
    print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherry

key関数を使ったsorted()

sortedは新しいソート済みリストを返し、key関数によって独自の順序を指定できます。長さ、タプルのフィールド、大文字と小文字を区別しない順序などでソートできます。コードで複数キーのソートを示します。

# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]

# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']

# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']

keyを使ったmin()とmax()

minとmaxもkeyを受け取れるため、変換後の値が最小または最大となる要素を1回の呼び出しで取得できます。たとえば最も長い単語を求める場合です。コードで確認します。

words = ['banana', 'fig', 'strawberry', 'kiwi']

longest = max(words, key=len)
print(longest)   # strawberry

shortest = min(words, key=len)
print(shortest)  # fig

# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end)  # (1, 3)

短絡評価チェックのためのany()とall()

anyは最初に真と判定される要素で停止し、allは最初に偽と判定される要素で停止します。どちらも短絡評価を行うため、ジェネレーターと組み合わせると条件を高速かつ遅延的に検査できます。

nums = [2, 4, 6, 7, 8]

all_even = all(n % 2 == 0 for n in nums)
print(all_even)  # False  (7 is odd)

has_large = any(n > 5 for n in nums)
print(has_large) # True  (6 qualifies, stops there)

# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid)  # True

sum()、abs()、divmod()

どこでも使われる数学のヘルパー関数が3つあります。sum、abs、divmodです。divmod(a, b)は商と余りを一度に返すため、各桁を取り出すのに最適です。

# sum with generator
print(sum(n**2 for n in range(1, 6)))  # 55

# abs for distance problems
print(abs(-7))   # 7

# divmod for digit extraction
num = 1234
digits = []
while num:
    num, d = divmod(num, 10)
    digits.append(d)
digits.reverse()
print(digits)  # [1, 2, 3, 4]

理解度チェック

理解度を簡単に確認しましょう。内包表記と組み込み関数をどのように理解できたかを確かめます。質問は1つだけです。大丈夫です。✅

レッスンのまとめ

まとめ:内包表記はループを1行にまとめ、zipやsortedなどの組み込み関数はkey関数を受け取り、ジェネレーターは1回だけ走査する処理でメモリを節約します。

よくある質問

「内包表記と組み込み関数」レッスンは無料ですか?

はい。「内包表記と組み込み関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DSA Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DSA Interview Prepコースには全4レッスンが含まれています。

「内包表記と組み込み関数」で何を学びますか?

リスト・辞書・集合の内包表記、map、filter、zip、enumerate、key関数を使うsortedで簡潔な解法を書きます。 ブラウザで直接実行するハンズオンコードでDSA Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DSA Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDSA Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「内包表記と組み込み関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDSA Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのDSA Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リスト、タプル、スライス
  2. Pythonの辞書と集合
  3. 内包表記と組み込み関数
  4. 関数、クロージャ、ラムダ
← DSA Interview Prepに戻る