次のようなタプル(常にペア)のリストがあります。
[(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的な方法があるに違いないと感じています。
Python 2.3と互換性のあるバージョンは
sum([pair[0] for pair in list_of_pairs])
または、Pythonの最近のバージョンでは、 this answer または this one を参照してください。
sum(i for i, j in list_of_pairs)
も行います。
私はお勧め:
sum(i for i, _ in list_of_pairs)
注:
gettext
の代わりに変数_
(または__
を使用して、エイリアスj
)との競合を回避すると、少なくとも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
Numpy配列に変換することを気にしない場合は、np.sum
よりもaxis=0
を使用することができます here
以下はサンプルコードですが、リストの範囲を指定することもできます。
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