Python列表总和元素

时间:2015-12-23 12:50:38

标签: python list python-3.x

我在Python中有这个列表:

.error-msg {
  color: red;
  font-size: 14px;
}

如何获得这样的列表?,将第三个元素与第二个元素和第一个元素相加

[['jhidalgo', 19, u'6,8'],
['jhidalgo', 19, u'5,3'],
['jhidalgo', 20, u'7'],
['jhidalgo', 20, u'0,4'],
['jhidalgo', 20, u'0'],
['jhidalgo', 20, u'1,6'],
['jhidalgo', 21, u'6,9'],
['jhidalgo', 22, u'1,3'],
['jhidalgo', 23, u'6,9'],
['jtern', 19, u'6,9'],
['jtern', 19, u'3,2']
]

我需要通过对[['jhidalgo', 19, u'12,1'], ['jhidalgo', 20, u'9'], ['jhidalgo', 21, u'6,9'], ['jhidalgo', 22, u'1,3'], ['jhidalgo', 23, u'6,9'], ['jtern', 19, u'10,1'] ] third元素进行分组来对second元素求和。
例如,所有first jhidalgo ...总和为20

2 个答案:

答案 0 :(得分:3)

你可以使用pandas,这是一个很棒的python模块进行数据分析。

或者:

# sorting
d = {}
for name, value, amount in l:
    if (name, value) not in d:
        d[name, value] = 0
    d[name, value] += float(amount.replace(',', '.'))

# rewriting list
result = []
for (k, v), a in d.items():
    result.append([k, v, str(a).replace('.', ',')])

答案 1 :(得分:3)

假设这些值旨在将逗号解释为小数点,并且要分组的所有值都是连续的,您可以在此处使用itertools.groupby效果良好:

import itertools
from math import fsum
from operator import itemgetter

mylist = [...]

summed = [(name, num, fsum(float(x.replace(',', '.')) for x in g))
          for (name, num), g in itertools.groupby(mylist, key=itemgetter(0, 1))]

如果数据已经按键连续(并且保持顺序没有困难),则使用groupby是最佳解决方案,但如果要分组的值不是连续的,则可以排序(使用相同的密钥)对于groupby),例如在使用mylist.sort(key=itemgetter(0, 1))计算summed之前运行groupby,或者为了避免O(n log n)排序费用,您可以使用dict(或者为了简单起见,{{1} }})分组非连续组:

defaultdict(float)