リストを項目ごとに集計する(Python版・暫定)

今週買った本のサンプルコードがすべてPythonで書かれていたので、観念して今日はPythonチュートリアルhttp://www.python.jp/doc/release/tutorial/)と向き合っていました。翻訳してくださった方、ありがとうございます。

Hello Worldということで、ためしに次のJavaのコードをPythonで書いてみました。

import sys
import collections

# class Data(tuple):            # コメントで「不要」との指摘を頂いて削除しました
#     'Data(code, name, value)'

Data = collections.namedtuple('Data', ['code', 'name', 'value'])

data_list = [
    Data('A01', 'hoge', 100),
    Data('A01', 'piyo', 200),
    Data('A02', 'hoge', 300),
    Data('A03', 'hoge', 400),
    Data('A03', 'piyo', 500)
    ]

def summarize(code):
    sum = 0
    for d in data_list:
        if code == d.code:
            sum += d.value
    return (code, sum)

print map(summarize, set([data.code for data in data_list]))

一応取れました。わぁい。(どういう時にクラスを使うか分かっていない、嬉しがってリスト内包表記を使っている等、明らかに混乱したコードですが…)

そういえば、GroupByはあるのでしょうか。summarizeをフラットに書きたくて試行錯誤したのですが、自力ではまだムリでした。data_listを明示的に渡さずに、summarizeの中から(スコープ任せで)参照していますが、これを改善したいです。

まあ、また、そのうちに。