最初の列の項目を辞書にグループ化します。adefaultdict
はそれを少し簡単にします:
from collections import defaultdict
sums = defaultdict(int)
for tup in l:
sums[tup[0]] += int(tup[1])
defaultdict
キーが存在しない場合は、渡されたファクトリを呼び出してデフォルト値を生成します (int
この場合は を生成します0
)。
>>> d = defaultdict(int)
>>> d['foo']
0
デモ:
>>> l=[['A1','1','2'],['A1','1','2'],['A1','3','3'],['B1','1','2'],['B1','5','5']]
>>> from collections import defaultdict
>>> sums = defaultdict(int)
>>> for tup in l:
... sums[tup[0]] += int(tup[1])
...
>>> sums
defaultdict(<class 'int'>, {'B1': 6, 'A1': 5})
次に、合計を印刷するのは次のように簡単です。
for key in sorted(sums):
print 'sum{}={}'.format(key, sums[key])
入力リストがソートされている場合は、次を使用しますitertools.groupby()
。
from itertools import groupby
from operator import itemgetter
sums = {key: sum(int(t[1]) for t in group) for key, group in groupby(l, key=itemgetter(0))}
デモ:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> {key: sum(int(t[1]) for t in group) for key, group in groupby(l, key=itemgetter(0))}
{'B1': 6, 'A1': 5}
実際、並べ替えられたリストを使用すると、groupby
直接印刷に切り替えることができます。
for key, group in groupby(l, key=itemgetter(0)):
print 'sum{}={}'.format(key, sum(t[1]) for t in group))
外部モジュールがなければ、私はただ辞書を探します。これは、上記のオプションのいずれよりも遅くなります。
sums = {}
for tup in l:
sums[tup[0]] = sums.get(tup[0], 0) + int(tup[1])
または、並べ替えられたバリアントの場合:
sum, last = 0, l[0][0]
for tup in l:
key = tup[0]
if last != key and sum:
print 'sum{}={}'.format(last, sum)
sum, last = 0, key
sum += int(tup[1])
if sum:
print 'sum{}={}'.format(key, sum)