不是漂亮的,而是:
from collections import defaultdict
linesort = [['Me', 1, 596], ['Mine', 1, 551], ['Myself', 1, 533], ['Myself', 1, 624],
['Myself', 1, 656], ['Myself', 1, 928], ['Theirs', 1, 720],
['Theirs', 1, 1921], ['Them', 1, 716], ['Themselves', 1, 527]]
d = defaultdict(list)
for line in linesort:
d[line[0]].append(line[1:])
output = {}
for x,val in d.items():
svals = [y[1] for y in val]
output[x] = [sum([y[0] for y in val]), sum(svals) / len(svals)] # need to be modified if you need float value
print output
>>> {'Mine': [1, 551], 'Theirs': [2, 1320], 'Me': [1, 596], 'Them': [1, 716], 'Themselves': [1, 527], 'Myself': [4, 685]}
或者使用 groupby(注意它不是最有效的,需要对包含初始数据的列表进行排序):
from itertools import groupby
res = {}
for key, gen in groupby(sorted(linesort), key=lambda x: x[0]):
val = list(gen)
svals = [y[2] for y in val]
res[key] = [sum([y[1] for y in val]), sum(svals) / float(len(svals))]
但是我之前的所有示例都会返回一个字典,所以如果你想获得一个列表,你只需要稍微修改一下代码:
from itertools import groupby
res = []
for key, gen in groupby(sorted(linesort), key=lambda x: x[0]):
val = list(gen)
svals = [y[2] for y in val]
res.append([key, sum([y[1] for y in val]), sum(svals) / float(len(svals))])
print res
>>> [['Me', 1, 596.0], ['Mine', 1, 551.0], ['Myself', 4, 685.25], ['Theirs', 2, 1320.5], ['Them', 1, 716.0], ['Themselves', 1, 527.0]]