我有一个这样的元组列表(总是成对):
[(0, 1), (2, 3), (5, 7), (2, 1)]
我想找到每对中第一项的总和,即:
0 + 2 + 5 + 2
我怎样才能在Python中执行此操作?目前我正在遍历列表:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
我觉得必须有更多的Pythonic方式。
答案 0 :(得分:60)
答案 1 :(得分:36)
sum(i for i, j in list_of_pairs)
也会这样做。
答案 2 :(得分:15)
我建议:
sum(i for i, _ in list_of_pairs)
注意:
使用变量_
(或__
以避免与gettext
的别名冲突而不是j
至少有两个好处:
_
(代表占位符)具有更好的可读性pylint
不会抱怨:"未使用的变量' j'" 答案 3 :(得分:5)
如果您有一个非常大的列表或生成大量对的生成器,您可能希望使用基于生成器的方法。为了好玩,我也使用itemgetter()
和imap()
。但是,基于简单生成器的方法可能就足够了。
import operator
import itertools
idx0 = operator.itemgetter(0)
list_of_pairs = [(0, 1), (2, 3), (5, 7), (2, 1)]
sum(itertools.imap(idx0, list_of_pairs))
请注意itertools.imap()
在Python> = 2.3中可用。所以你也可以在那里使用基于生成器的方法。
答案 4 :(得分:3)
模糊(但很有趣)的答案:
>>> sum(zip(*list_of_pairs)[0])
9
或者当zip是迭代的时候,这应该可行:
>>> sum(zip(*list_of_pairs).__next__())
9
答案 5 :(得分:0)
下面是示例代码,您也可以指定列表范围。
def test_lst_sum():
lst = [1, 3, 5]
print sum(lst) # 9
print sum(lst[1:]) # 8
print sum(lst[5:]) # 0 out of range so return 0
print sum(lst[5:-1]) # 0
print sum(lst[1: -1]) # 3
lst_tp = [('33', 1), ('88', 2), ('22', 3), ('44', 4)]
print sum(x[1] for x in lst_tp[1:]) # 9
答案 6 :(得分:0)
如果您不介意将其转换为numpy数组,则可以按照给定here的用法,在np.sum
上使用axis=0
答案 7 :(得分:-2)
s,p=0,0
for i in l:
s=s+i[0]
p=p+i[1]
print(tuple(s,p))