web-dev-qa-db-ja.com

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]

もっとPython的な方法があるに違いないと感じています。

27
Ben

Python 2.3と互換性のあるバージョンは

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

または、Pythonの最近のバージョンでは、 this answer または this one を参照してください。

60
David Z
sum(i for i, j in list_of_pairs)

も行います。

37
SilentGhost

私はお勧め:

sum(i for i, _ in list_of_pairs)

gettextの代わりに変数_(または__を使用して、エイリアスj)との競合を回避すると、少なくとも2つの利点があります。

  1. _(プレースホルダーの略)は読みやすくなっています
  2. pylintは文句を言わない:「未使用の変数 'j'」
15
Hui Zheng

非常に大きなリストや、多数のペアを生成するジェネレーターがある場合は、ジェネレーターベースのアプローチを使用できます。楽しみのために、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で使用できることに注意してください。そこでジェネレーターベースのアプローチをそこで使用することもできます。

5
unbeknown

あいまいな(しかし楽しい)答え:

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

または、Zipが反復可能である場合、これだけが機能するはずです。

>>> sum(Zip(*list_of_pairs).__next__())
9
3
Ali Afshar

Numpy配列に変換することを気にしない場合は、np.sumよりもaxis=0を使用することができます here

0
mithunpaul

以下はサンプルコードですが、リストの範囲を指定することもできます。

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
0
Jayhello