如何在Python中的元组列表中对每个元组中的第一个值求和?

时间:2009-03-12 10:37:27

标签: 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]

我觉得必须有更多的Pythonic方式。

8 个答案:

答案 0 :(得分:60)

与Python 2.3兼容的版本是

sum([pair[0] for pair in list_of_pairs])

或在最新版本的Python中,请参阅this answerthis one

答案 1 :(得分:36)

sum(i for i, j in list_of_pairs)

也会这样做。

答案 2 :(得分:15)

我建议:

sum(i for i, _ in list_of_pairs)

注意

使用变量_(或__以避免与gettext的别名冲突而不是j至少有两个好处:

  1. _(代表占位符)具有更好的可读性
  2. 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))
  1. 在此处输入代码