方法#1:
这是最快的方法:
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
out = {}
for x, y in t:
if x in out:out[x] += y
else:out[x] = y
输出:
{'a': 5, 'b': 2, 'c': 3}
方法#2:
这是最简单的方法:
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
输出:
{'a': 5, 'b': 2, 'c': 3}
我最快方法的证明:
我使用timeit 来计算用户回答的每种方法需要多少时间。最快的是我的(方法#1):
from timeit import timeit
from itertools import groupby #for method 1
from collections import defaultdict #for method 2 and 5
from collections import Counter #for method 3
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
###############################
######### METHODS ###########
###############################
def method1(): #By Austin
f = lambda x: x[0]
{k: sum(x[1] for x in g) for k, g in groupby(sorted(t, key=f), key=f)}
###############################
def method2(): #By Austin
d = defaultdict(int)
for x in t:
d[x[0]] += x[1]
###############################
def method3(): #By Jean-Claude Arbaut
h = Counter()
for k, v in t:
h[k] += v
###############################
def method4(): #By PHP
d = dict()
for x,y in t:
d[x] = d.get(x, 0) + y;
###############################
def method5(): #By Skam
char_to_int = defaultdict(int)
for k, v in t:
char_to_int[k] += v
###############################
def method6(): #By Aquiles Carattino
d = dict()
for x, y in t:
if x in d:
d[x]+=y
else:
d[x] = y
###############################
def method7(): #My method 2
d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
###############################
def method8(): #My method 1
out = {}
for x, y in t:
if x in out:out[x] += y
else:out[x] = y
print(timeit(method1))
print(timeit(method2))
print(timeit(method3))
print(timeit(method4))
print(timeit(method5))
print(timeit(method6))
print(timeit(method7))
print(timeit(method8))
我平台上的输出是:
5.7539954
1.7488919999999997
4.2322991000000005
1.0104673999999996
1.3571206
0.8095216999999995
1.5506056999999984
0.6387891000000003
所以最快的方法是我回答的方法 8(方法 #1)。