在python列表中为每年添加值

时间:2013-08-12 23:19:13

标签: python

给定[yyy,m,value]的列表,我需要添加与一年相对应的所有值。那就是,

A = [
[['2008', '3', '5'],['2008', '4', '35'],['2013', '3', '71']],
[['2008', '6', '2'],['2008', '7', '2'],['2008', '8', '4'],['2013', '3', '128']]
]

成为

A = [
[['2008', '40'],['2013','71']],
[['2008', '8'],['2013','128']]
]

最好的方法是什么?感谢。

3 个答案:

答案 0 :(得分:2)

使用defaultdict

from collections import defaultdict

b = []

for line in A:
    d = defaultdict(int)
    for entry in line:
        d[entry[0]] += int(entry[2])
    b.append([(k,str(v)) for k,v in sorted(d.items(),key=lambda x: int(x[0]))])

给出

b
Out[71]: [[('2008', '40'), ('2013', '71')], [('2008', '8'), ('2013', '128')]]

答案 1 :(得分:0)

你可以明确地使用一些简单的循环:

A = [[['2008', '3', '5'],['2008', '4', '35'],['2013', '3', '71']],
[['2008', '6', '2'],['2008', '7', '2'],['2008', '8', '4'],['2013', '3', '128']]    ]

l,B,k=[],[],0

for x in A:
    for y in x:
        l.append(y[0])
    for z in set(l):
        for y in x:
             if y[0] == z:
                k += int(y[2])
        B.append([z,k])
        k=0
print B

这给出了预期的:

>>>B
[['2008', 40], ['2013', 71], ['2008', 8], ['2013', 128]]

答案 2 :(得分:0)

这有效:

for i,li in enumerate(A):
    d={}
    for sli in li:
        year=sli[0]
        d.setdefault(year,0)
        d[year]+=int(sli[-1])

    A[i]=[[k,str(d[k])] for k in sorted(d.keys())]

A的值被替换为:

>>> A
[[['2008', '40'], ['2013', '71']], [['2008', '8'], ['2013', '128']]]