Python 每个元素在列表中的列表中求和列

Python 每个元素在列表中的列表中求和列,python,list,sum,2d,Python,List,Sum,2d,对于列表列表,是否有某种方法可以对列表中每个特定元素的列求和(使用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]求和(列

对于列表列表,是否有某种方法可以对列表中每个特定元素的列求和(使用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]求和(列的数量/类型不会改变)。 我的atm代码只是一个简单的列表理解,它对第1列的所有内容求和,而不考虑A1、B1等

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

考虑到每个“A1,B1..”都会有相同数量的项目,比如说10,另一种方法是在i[1]中每10个数字求和,但我需要能够说‘前10个数字的和是A1,后10个数字的和是B2,等等’。感谢您的帮助

将第一列中的项目分组到字典中;a使这更容易:

from collections import defaultdict

sums = defaultdict(int)

for tup in l:
    sums[tup[0]] += int(tup[1])
defaultdict
只要调用传入的工厂,在没有键的情况下生成默认值(
int
在本例中,生成
0
):

演示:

如果输入列表已排序,请使用
itertools.groupby()

演示:

事实上,通过排序列表和
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)

将第一列上的项目分组到字典中;a使这更容易:

from collections import defaultdict

sums = defaultdict(int)

for tup in l:
    sums[tup[0]] += int(tup[1])
defaultdict
只要调用传入的工厂,在没有键的情况下生成默认值(
int
在本例中,生成
0
):

演示:

如果输入列表已排序,请使用
itertools.groupby()

演示:

事实上,通过排序列表和
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)

这些看起来不错,但defaultdict是必要的还是可以在for循环中完成?我是瞎子。刚刚注意到for循环。那么,如果项目已经排序,defaultdict实际上会做什么呢?@Op.Ivy:添加了澄清;如果您的输入列表已排序,则不必麻烦使用
defaultdict
,直接进入
groupby
@Martijn Pieters:很好的解释,这就把它清除了。没有itertools也能实现这一点吗?我正在尝试不使用模块来学习基础知识。感谢帮助这些看起来不错,但是defaultdict是必要的还是可以在for循环中完成?我是瞎子。刚刚注意到for循环。那么,如果项目已经排序,defaultdict实际上会做什么呢?@Op.Ivy:添加了澄清;如果您的输入列表已排序,则不必麻烦使用
defaultdict
,直接进入
groupby
@Martijn Pieters:很好的解释,这就把它清除了。没有itertools也能实现这一点吗?我正在尝试不使用模块来学习基础知识。谢谢你的帮助
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)
>>> 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