メインコンテンツにスキップ
モジュール 8 · レッスン 3 / 4コース内の 31/36~12 min
モジュールのレッスン (3/4)

コレクション: Counter とdefaultdict

collections モジュールは、 組み込みのコレクション。最もよく使用される 3 つ: Counter、defaultdict、 namedtuple。

Counter: 頻度のカウント

Python
from collections import Counter

parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})

c["mela"]            # 3
c["banana"]          # 0   (default for missing keys, NO KeyError)
c.most_common(2)     # [('mela', 3), ('pera', 2)]

文字列でも機能します (文字数をカウントします)。

Python
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})

カウント (+、-、&、|) に対する集合のような演算をサポートしており、非常に便利です さまざまなソースからのカウントを集計します。

defaultdict: 自動デフォルトの辞書

欠落しているキーにアクセスすると、メソッドを呼び出して作成する辞書。 工場。

Python
from collections import defaultdict

gruppi = defaultdict(list)        # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
    gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})

defaultdict を使用しない場合は、次のように記述する必要があります。

Python
gruppi = {}
for nome in [...]:
    if nome not in gruppi:
        gruppi[nome] = []
    gruppi[nome].append(1)

一般的なファクトリ: list、int (デフォルトは 0)、set、dict。

namedtuple: フィールド名のタプル

不変のレコードクラスを作成する軽量の方法。タプルですが、 名前によるフィールドアクセスを使用します。

Python
from collections import namedtuple

Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x          # 3 (access by name)
p[0]         # 3 (access by index, still a tuple)
p.x + p.y    # 7

# typical use: return multiple values from a function
def divisione(a, b):
    Risultato = namedtuple("Risultato", ["quoziente", "resto"])
    return Risultato(a // b, a % b)

r = divisione(17, 5)
r.quoziente   # 3
r.resto       # 2

(より高度なケースについては、3.7 以降の dataclasses もあります。M9 を参照してください。)

名前付きタプル: 軽量で不変のレコード

collections モジュールは namedtuple もエクスポートします。これにより、コンストラクターやボイラープレート メソッドを作成せずに、軽量のクラスのようなオブジェクトをすばやく構築して構造化データを保存できます。

Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

試してみてください

運動#python.m8.l3.e1
試行回数: 0読み込み中…

リスト `words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']` を指定すると、`top` 内の最も頻繁に使用される単語を文字列として計算します。 「トップ」を評価します。

エディターを読み込み中…
ヒントを表示

Counter(...).most_common(1) は [(word, count)] を返します。

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m8.l3.e2
試行回数: 0読み込み中…

学生の `enrollments = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]` として、defaultdict(list) として `courses_per_student` を構築します。 `dict(courses_per_student)` を評価します。

エディターを読み込み中…
ヒントを表示

次に、defaultdict(list) の s、c を登録します。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m8.l3.e3
試行回数: 0読み込み中…

「コレクション」から「カウンター」をインポートします。文字列 \`text = "abracadabra"\` 内の文字の頻度を数えます。カウンタを \`char_counter\` に保存し、評価します。

エディターを読み込み中…
ヒントを表示

Counter は文字列をパラメータとして受け取り、各文字の出現数をカウントします。

3 回の試行後に解決策が利用可能になります