在Python中,如何对元组列表中每个元组的第一个值求和?
我有一个元组列表(总是成对的),如下所示:在Python中,如何对元组列表中每个元组的第一个值求和?,python,list,tuples,Python,List,Tuples,我有一个元组列表(总是成对的),如下所示: [(0, 1), (2, 3), (5, 7), (2, 1)] 我想找出每对中第一项的总和,即: 0 + 2 + 5 + 2 如何在Python中实现这一点?目前,我正在遍历列表: sum = 0 for pair in list_of_pairs: sum += pair[0] 我有一种感觉,一定有一种更具Python风格的方式。一个与python2.3兼容的版本正在发布 sum([pair[0] for pair in list_of
[(0, 1), (2, 3), (5, 7), (2, 1)]
我想找出每对中第一项的总和,即:
0 + 2 + 5 + 2
如何在Python中实现这一点?目前,我正在遍历列表:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
我有一种感觉,一定有一种更具Python风格的方式。一个与python2.3兼容的版本正在发布
sum([pair[0] for pair in list_of_pairs])
或者在Python的最新版本中,请参阅或
也可以。如果您有一个非常大的列表或生成大量对的生成器,您可能需要使用基于生成器的方法。为了好玩,我还使用了
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中可用。因此,您也可以在那里使用基于生成器的方法。晦涩(但有趣)的答案:
或者,如果zip是可移植的,则仅此项功能有效:
>>> sum(zip(*list_of_pairs).__next__())
9
我建议:
sum(i for i, _ in list_of_pairs)
注:
使用变量\uu
(或\u
避免与别名gettext
冲突)而不是j
至少有两个好处:
(代表占位符)具有更好的可读性pylint
不会抱怨:“未使用的变量'j'”下面是示例代码,您还可以指定列表范围
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
如果您不介意将其转换为numpy数组,您可以使用
np.sum
overaxis=0
,如下所示
起初我是这么认为的,但当我尝试用最快的Python访问它时,出现了一个语法错误:-(原来我是在Python 2.3上测试的,不过…+1反正+1:更喜欢这样——元组有一个固定的大小,你通常知道它的大小。我也喜欢这种方法。但是Davids解决方案也可以使用n元组,这可能更可取,这取决于实际问题。我应该注意到,这段代码比接受答案。
i
和j
应替换为first
和second
;)我删除了方括号,因为在python首先创建列表时,方括号会使它变慢。sum()使用迭代器可以很好地工作。gs,您以David提到SilentGhost的代码不工作的方式破坏了代码。您将列表理解转换为生成器表达式(而不是迭代器),直到Python 2.4才存在。我回滚了编辑,因为如果要使用与Python 2.3不兼容的方法,它也可能是SilentGhost的答案中的方法。保持此Python 2.3兼容仍然有意义吗?至少可以发布使用生成器表达式的版本。如果需要,则无需创建列表可以避免。@juanchopanza发布了一个使用生成器的版本。这是下一个答案。不过我可以编辑以澄清这一点。速度并不比其他两个解决方案快。速度总是很好,至少应该在答案中提到。然后我建议使用C或汇编语言的解决方案。这种方法的案例在第一部分中清楚地列出答案的句子。这里有一个语法错误–尽管是一个非常小的语法错误。最后一行应该加上一个后缀“”delimiter.mmm,“zip”对象没有属性“next”。它确实有属性next,但您仅限于低于2.4的python版本?我这样问是因为你选择的答案不必要地创建了一个临时列表。python>=24中的简单一行是sum(p[0]表示成对列表中的p)
。
sum(i for i, _ in list_of_pairs)
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
s,p=0,0
for i in l:
s=s+i[0]
p=p+i[1]
print(tuple(s,p))