簡體   English   中英

如何在 Python 中的元組列表中對每個元組中的第一個值求和?

[英]How do I sum the first value in each tuple in a list of tuples in Python?

我有一個像這樣的元組列表(總是成對的):

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

與 Python 2.3 兼容的版本是

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

或在 Python 的最新版本中,請參閱此答案答案

sum(i for i, j in list_of_pairs)

也會做。

我建議:

sum(i for i, _ in list_of_pairs)

注意

使用變量_ (或__以避免與gettext的別名沖突)而不是j至少有兩個好處:

  1. _ (代表占位符)具有更好的可讀性
  2. pylint不會抱怨:“未使用的變量‘j’”

如果您有一個非常大的列表或生成大量對的生成器,您可能需要使用基於生成器的方法。 為了好玩,我也使用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 中可用。 所以你也可以在那里使用基於生成器的方法。

晦澀(但有趣)的答案:

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

或者當 zip 是可迭代的時,只有這應該工作:

>>> sum(zip(*list_of_pairs).__next__())
9

下面是示例代碼,您還可以指定列表范圍。

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.sumaxis=0給出這里

                s,p=0,0
                for i in l:
                  s=s+i[0]
                  p=p+i[1]
               print(tuple(s,p))
  1. 在此處輸入代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM