36

我有一个像这样的元组列表(总是对):

[(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 的方式。

4

8 回答 8

72

在 Python 的现代版本中,我建议SilentGhost 发布的内容(为清楚起见,在此重复):

sum(i for i, j in list_of_pairs)

在这个答案的早期版本中,我提出了这个建议,这是必要的,因为 SilentGhost 的版本在当时最新的 Python (2.3) 版本中不起作用:

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

现在那个版本的 Python 已经过时了,而且 SilentGhost 的代码适用于所有当前维护的 Python 版本,所以不再有任何理由推荐我最初发布的版本。

于 2009-03-12T10:39:31.147 回答
44
sum(i for i, j in list_of_pairs)

也会这样做。

于 2009-03-12T10:43:45.117 回答
22

我建议:

sum(i for i, _ in list_of_pairs)

注意

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

  1. _(代表占位符)具有更好的可读性
  2. pylint不会抱怨:“未使用的变量'j'”
于 2012-04-21T03:24:43.627 回答
6

如果您有一个非常大的列表或生成大量对的生成器,您可能希望使用基于生成器的方法。为了好玩,我也使用itemgetter()and 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 中可用。所以你也可以在那里使用基于生成器的方法。

于 2009-03-12T10:52:48.777 回答
4

晦涩(但有趣)的答案:

>>> sum(zip(*list_of_pairs)[0])
9

或者当 zip 是可迭代的时,只有这应该起作用:

>>> sum(zip(*list_of_pairs).__next__())
9
于 2009-03-12T11:19:19.150 回答
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
于 2017-12-27T06:55:13.707 回答
0

如果您不介意将其转换为 numpy 数组,则可以使用这里给出np.sum的 overaxis=0

于 2018-08-05T07:32:39.243 回答
-2
                s,p=0,0
                for i in l:
                  s=s+i[0]
                  p=p+i[1]
               print(tuple(s,p))
  1. 在这里输入代码

于 2020-03-04T14:35:39.473 回答