在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
    over
    axis=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))