すべてのデータを含む 1 つの辞書を事前に初期化する方法を次に示します。
a = "eggs bacon ham".split()
summary = dict((key,([],[],[],[])) for key in a)
for lineno,line in enumerate(csv_file):
# first element in the line is assumed to be the key ("eggs", "bacon", etc.)
key = line[0]
# update the data values for this key
summary[key][0].append(lineno)
summary[key][1].append(something_else)
# ... etc.
ただし、この種のインデックス付きアクセスは少し脆弱であり、キー付きアクセスまたは属性アクセスを好みます。ハードコーディングされた 4 つのリストのリストは、dict またはいくつかの単純なデータ集計クラスのオブジェクトとしてより適切に表現される場合があります。
また、CSV ファイルに「パンケーキ」、「ワッフル」、「ハッシュブラウン」などのエントリがあるため、「卵」、「ベーコン」、「ハム」のリストは時間の経過とともに増えると思います。最近、データ ファイルやデータベース テーブルを調べながら、データを集計するために defaultdict を使用することが多くなりました。取得するキーを事前に定義する (入力データに新しい値が追加されたときにリストを自分で更新する必要がある) 代わりに、defaultdict は定義したフォームの新しいエントリを追加するだけです。
class Tally(object):
def __init__(self):
self.count = 0
self.lines = []
self.values = []
from collections import defaultdict
summary = defaultdict(Tally)
for lineno,line in enumerate(csv_file):
# first element in the line is assumed to be the key ("eggs", "bacon", etc.)
key = line[0]
# update the data values for this key
summary[key].count += 1
summary[key].lines.append(lineno)
summary[key].values.append(line[1])
# ... etc.
defaultdict を使用すると、「キーが summarydict にない場合: 新しいエントリを追加...」という面倒で繰り返しのオーバーヘッドが省けるため、コードはかなりクリーンなままです。