使用python对同一个键列表中的多个值求和

使用python对同一个键列表中的多个值求和,python,list,Python,List,我有一个列表,如下所示: (151258350, 2464) (151258350, 56) (151262958, 56) (151258350, 56) (151262958, 112) (151262958, 112) (151259627, 56) (151262958, 112) (151262958, 56) 151259627 56 151262958 448 151258350 2576 我想要的结果如下所示: (151258350, 2464) (151258350, 56

我有一个列表,如下所示:

(151258350, 2464)
(151258350, 56)
(151262958, 56)
(151258350, 56)
(151262958, 112)
(151262958, 112)
(151259627, 56)
(151262958, 112)
(151262958, 56)
151259627 56
151262958 448
151258350 2576
我想要的结果如下所示:

(151258350, 2464)
(151258350, 56)
(151262958, 56)
(151258350, 56)
(151262958, 112)
(151262958, 112)
(151259627, 56)
(151262958, 112)
(151262958, 56)
151259627 56
151262958 448
151258350 2576
这是我的代码:

for key, vals in d.items():
    tempList.append((key, reduce(add, vals))) 
这里,d是带有键值对的列表。tempList是值按键求和后将附加到其中的列表。add是一个函数:

def add(x, y): return x+y
如果已经问过这个问题,请告诉我,因为我自己找不到。

您可以使用计数器

第二部分

如果你觉得“Animesh”的答案很有趣,你可以用一种更简单的方式来尝试:这将不需要任何导入。不使用.get()

使用:


最简单的方法是使用


如果您的
source
实际上是一个dict(而不是您在问题中描述的元组列表),请将
替换为
作为键,源代码中的值:
,替换为
作为键,源代码中的值。iteritems()

r = dict(set((a, sum(y for x, y in t if x == a)) for a, b in t))

什么是
d
?什么是圣殿骑士?什么是添加?问题是什么?
d.items()
?看起来你有一本字典,但你说你有一个列表?@juanchopanza-为你的问题补充了澄清。谢谢你停下来问这个琐碎的问题,并留下你的评论。这些问题是由那些仍然是脚本语言初学者的人提出的。@Nir是编程语言的初学者不是问题。它是关于提出清晰、简洁的问题,而不必让别人猜测你。@juanchopanza,谢谢你的提示。这是额外的学习:-)不要做
dict.get(key)
检查字典中是否存在密钥。使用
key-in-dict
key-in-dict
dict.get
有什么好处?
dict.get(key)
返回值(
dict[key]
),如果键存在,则返回值;如果键不存在,则返回
None
作为回退值。它实际上并不检查字典中是否存在该键。例如,对于字典
d={'foo':None,'bar':0}
,这两个键都不会报告为字典中存在(因为
d['foo']
None
,并且
d['foo']
返回一个伪值)。能否粘贴
num_list
?字典中的键在设计上是唯一的,因此,在
cnt[key]
上执行
+=
是不必要的,因为如果您在字典
d
上迭代,该键将不存在。如果你有一个字典作为基础,你只需要做
Counter(d)
就可以从中创建一个计数器。但由于OP有多个相同的“键”,我不相信他们有字典,我现在已经编辑过了。。。但是现在它看起来像是你的代码…谢谢你指出了一个错误,
source
不能是字典,因为OP在字典中有多个相同的键,键应该是唯一的。除此之外,答案是非常好的,所以我不知道为什么这会被否决…@poke这个问题有点不清楚,由于代码OP清楚地使用了
,它出现在dicts上,但不在列表上。。。这个问题并没有提到它会导致的属性错误。所以我把这两种方法都包括在内。截至downvote——可能有人没有仔细阅读答案:)
result = defaultdict(int)
for key, value in source:
    result[key] += value

# if you really want result as a list of tuples
rslt = list(result.items())
num_list = [(151258350, 2464),
(151258350, 56),
(151262958, 56),
(151258350, 56),
(151262958, 112),
(151262958, 112),
(151259627, 56),
(151262958, 112),
(151262958,56)]
num_dict = {}
for t in num_list:
    if t[0] in num_dict:
        num_dict[t[0]] = num_dict[t[0]]+t[1]
    else:
        num_dict[t[0]] = t[1]

for key,value in num_dict.items():
    print "%d %d" %(key,value)
r = dict(set((a, sum(y for x, y in t if x == a)) for a, b in t))