可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a list ["Roll_Number","Marks in subjects"]:
list_1=[(1,22),(1,22),(2,29),(2,16),(3,56),(4,32),(4,12)]
I tried this code in python to get sum of all subjects for each roll_no :
sub_sum = [0] * 4 #Roll No :4
if i in range(0,len(list1)):
if k in range(0,5):
if (list1[i][0]==k):
sub_sum[k] = list1[i][1] + sub_sum[k]
i=i+1
else:
k=k+1
break
Getting an infinite loop.
Expected Result : 1:44 , 2:45, 3:56 , 4:44
Thanks in advance.
回答1:
You can do that as follows:
from collections import defaultdict
a = [(1,22),(1,22),(2,29),(2,16),(3,56),(4,32),(4,12)]
b = defaultdict(lambda: 0)
for i,j in a:
b[i] += j
>>> print b
{1:44, 2:45, 3:56, 4:44}
DEMO
回答2:
Since your list is sorted by first element already, you can use itertools.groupby
for a relatively simple one-line solution:
>>> from itertools import groupby as gb
>>> from operator import itemgetter
>>>
>>> l = [(1,22),(1,22),(2,29),(2,16),(3,56),(4,32),(4,12)]
>>>
>>> {a: sum(t[1] for t in b) for a,b in gb(l, itemgetter(0))}
{1: 44, 2: 45, 3: 56, 4: 44}
回答3:
Using defaultdict
>>> list_1=[(1,22),(1,22),(2,29),(2,16),(3,56),(4,32),(4,12)]
>>> from collections import defaultdict
>>> res = defaultdict(int)
>>> for key, val in list_1:
... res[key] += val
...
>>> print res
defaultdict(<type 'int'>, {1: 44, 2: 45, 3: 56, 4: 44})
>>> print dict(res)
{1: 44, 2: 45, 3: 56, 4: 44}
回答4:
you can also use the groupby
from itertools
>>> from itertools import groupby
>>> from operator import itemgetter
>>> result = [(k, sum(r[1] for r in rows)) for k, rows in groupby(list_1, key=itemgetter(0))]
>>> result
[(1, 44), (2, 45), (3, 56), (4, 44)]
回答5:
Not the most intuitive
from collections import Counter
from itertools import chain, repeat
Counter(chain.from_iterable(repeat(x, y) for x, y in list_1))
Counter({3: 56, 2: 45, 1: 44, 4: 44})