0Pricing
Coding Interview Prep · レッスン

Pythonの辞書と集合

dictとsetの構築、メンバーシップテスト、collections.Counterで頻度を数える一般的なパターンを学びます。

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

Pythonの辞書:キーと値のストア

Pythonのdictは、キーと値を対応付け、検索、挿入、削除を平均O(1)で実行できます。two-sum、アナグラムの判定、出現回数のカウントを支える仕組みです。コードで示します。

d = {'apple': 3, 'banana': 5}
print(d['apple'])   # 3
d['cherry'] = 7
print(len(d))       # 3
print('banana' in d)  # True
del d['apple']
print(d)            # {'banana': 5, 'cherry': 7}

.get()による安全な検索

存在しないキーをd[key]で読み取ると、KeyErrorが発生します。代わりにd.get(key, default)を使うと、フォールバック値を返せます。予期しない実行時エラーを防ぐ安全な習慣です。

freq = {}
words = ['the', 'cat', 'sat', 'on', 'the', 'mat']
for w in words:
    freq[w] = freq.get(w, 0) + 1
print(freq)
# {'the': 2, 'cat': 1, 'sat': 1, 'on': 1, 'mat': 1}

print(freq.get('dog', 0))  # 0  (no KeyError)

より簡潔なグループ化のためのdefaultdict

defaultdict(list)は新しいキーに対して空のリストを自動的に作成するため、グループ化の定型コードを省けます。defaultdict(int)ではすべてのキーが0から始まるので、簡単にカウントできます。

from collections import defaultdict

groups = defaultdict(list)
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
for w in words:
    key = ''.join(sorted(w))  # canonical anagram key
    groups[key].append(w)

print(list(groups.values()))
# [['eat','tea','ate'], ['tan','nat'], ['bat']]

Counter:高速な出現頻度マップ

Counterはカウント用のdictです。任意のイテラブルを渡すと、すぐに出現頻度マップを取得できます。most_common(k)は上位k件を返します。コードでアナグラムの判定を示します。

from collections import Counter

c = Counter('abracadabra')
print(c)           # Counter({'a':5,'b':2,'r':2,'c':1,'d':1})
print(c.most_common(2))  # [('a', 5), ('b', 2)]

# Valid anagram check
def is_anagram(s, t):
    return Counter(s) == Counter(t)

print(is_anagram('anagram', 'nagaram'))  # True

Pythonの集合:順序を持たない一意なコレクション

setは一意な要素を保持し、メンバーシップテストをO(1)で実行できます。{1, 2, 3}またはset(iterable)を使います。ただし{}はdictになるため、空のsetにはset()を使ってください。重複の検出に便利です。

seen = set()
nums = [1, 2, 3, 2, 1, 4]
duplicates = []
for n in nums:
    if n in seen:          # O(1) check
        duplicates.append(n)
    seen.add(n)
print(duplicates)  # [2, 1]
print(len(seen))   # 4  (unique values)

面接で役立つ集合演算

集合では数学的な演算ができます。|は和集合、&は積集合、-は差集合、^は対称差です。これらを使えば、「共通する要素」のような問題を1行で解けます。

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a | b)  # {1, 2, 3, 4, 5, 6}  union
print(a & b)  # {3, 4}              intersection
print(a - b)  # {1, 2}              difference
print(a ^ b)  # {1, 2, 5, 6}        symmetric diff

メンバーシップテスト:listとsetの比較

選ぶデータ構造によって速度が変わります。listでinを使った検索はO(n)ですが、setではO(1)です。繰り返し検索する前にlistをsetへ変換するのは、よく使われる高速化手法です。

word_list = ['apple', 'banana', 'cherry', 'date']
word_set  = set(word_list)

# O(n) per check
print('banana' in word_list)  # True

# O(1) per check
print('banana' in word_set)   # True

# Practical example: find common elements
a = [1, 2, 3, 4, 5]
b = [3, 4, 5, 6, 7]
common = [x for x in a if x in set(b)]
print(common)  # [3, 4, 5]

dictの反復:キー、値、要素

.keys()、.values()、または.items()を使ってdictをループできます。ループの途中でキーを削除してはいけません。まず削除するキーをリストに集め、その後で削除してください。コードで確認します。

scores = {'Alice': 90, 'Bob': 75, 'Carol': 88}

for name, score in scores.items():
    print(f'{name}: {score}')

# Find key with max value
best = max(scores, key=scores.get)
print(best)  # Alice

# Safe deletion
to_del = [k for k, v in scores.items() if v < 80]
for k in to_del:
    del scores[k]
print(scores)  # {'Alice': 90, 'Carol': 88}

frozenset:ハッシュ可能な集合

frozensetはイミュータブルな集合なので、dictのキーにしたり、別のsetの中に入れたりできます。順序が重要でない場合に、文字の集合でアナグラムをグループ化するのに便利です。

from collections import defaultdict

words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
groups = defaultdict(list)
for w in words:
    key = frozenset(w)  # hashable; 'eat','tea','ate' all share same key
    groups[key].append(w)

print([sorted(g) for g in groups.values()])
# [['ate','eat','tea'], ['nat','tan'], ['bat']]

変換のための辞書内包表記

辞書内包表記を使うと、{k: v for ...}のように1行でマッピングを作成できます。dictの反転やペアのフィルタリングに便利です。ただし、反転するには値が一意である必要があります。コードで確認します。

# Invert a dict
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
print(inverted)  # {1:'a', 2:'b', 3:'c'}

# Filter by value
scores = {'Alice': 90, 'Bob': 55, 'Carol': 78}
passing = {k: v for k, v in scores.items() if v >= 60}
print(passing)  # {'Alice': 90, 'Carol': 78}

最長連続シーケンス

setを使うと、最長連続シーケンスをO(n)で求められます。すべての数値をsetに入れ、直前の数値が存在しない各要素からだけ、連続して数え上げます。ソートは必要ありません。

def longest_consecutive(nums):
    num_set = set(nums)
    best = 0
    for n in num_set:
        if n - 1 not in num_set:  # start of sequence
            cur = n
            streak = 1
            while cur + 1 in num_set:
                cur += 1
                streak += 1
            best = max(best, streak)
    return best

print(longest_consecutive([100,4,200,1,3,2]))  # 4 (1,2,3,4)

理解度チェック

理解度を簡単に確認しましょう。このレッスンのdictとsetの考え方がどれだけ身に付いたかを確かめてください。ここでは直感を信じて大丈夫です。🎯

レッスンのまとめ

まとめ:dictはカウントやグループ化でO(1)の検索を実現し、Counterとdefaultdictは定型コードを減らし、setはO(n)の走査をO(1)のチェックに変えます。

よくある質問

「Pythonの辞書と集合」レッスンは無料ですか?

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

「Pythonの辞書と集合」で何を学びますか?

dictとsetの構築、メンバーシップテスト、collections.Counterで頻度を数える一般的なパターンを学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Pythonの辞書と集合」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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