0

リストのリストの場合、リスト内の特定の要素ごとに列を合計する方法はありますか (python を使用)。例...

l=[['A1','1','2'],['A1','1','2'],['A1','3','3'],['B1','1','2'],['B1','5','5'],[...]]

A1、B1などの最初の列のみを合計し、目的の出力を次のように取得します...

sumA1=5
sumB1=6
sumC1.......

リストの値が変更される可能性があるため、「A1、B1 ..」への参照は必要ありません。A3、B4になる可能性があるため、インデックス[0]に従って合計するのが最善の方法です(列の数/タイプは変更されません)。私が持っているコードは、A1、B1などに関係なく、列1のすべてを合計する単純なリスト内包表記です.

for i in l:
    total = sum(float(i[1]) for i in l if i[1])

「A1、B1 ..」ごとに常に同じ数の項目があることを考えると、10 としましょう。別の方法として、i[1] で 10 個ごとの数値を合計することになりますが、「the最初の 10 個の数字の合計が A1 で、2 番目の 10 個の数字の合計が B2 などです。助けに感謝します

4

2 に答える 2

3

最初の列の項目を辞書にグループ化します。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)
于 2013-05-25T00:02:46.683 に答える
0
>>> from collections import defaultdict
>>> a = [["a",1,2],["a",2,3],["b",45,2]]
>>> my_dict = defaultdict(list)
>>> for itm in a:
...    my_dict[itm[0]].append(itm)
...
>>> for k,v in my_dict.items():
...    print "Sum %s:%s"%(k,sum(zip(*v)[1]))
...
Sum a:3
Sum b:45
于 2013-05-25T00:09:58.063 に答える