How do I sum the first value in each tuple in a list of tuples in Python?
Question:
I have a list of tuples (always pairs) like this:
[(0, 1), (2, 3), (5, 7), (2, 1)]
I’d like to find the sum of the first items in each pair, i.e.:
0 + 2 + 5 + 2
How can I do this in Python? At the moment I’m iterating through the list:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
I have a feeling there must be a more Pythonic way.
Answers:
In modern versions of Python I’d suggest what SilentGhost posted (repeating here for clarity):
sum(i for i, j in list_of_pairs)
In an earlier version of this answer I had suggested this, which was necessary because SilentGhost’s version didn’t work in the version of Python (2.3) that was current at the time:
sum([pair[0] for pair in list_of_pairs])
Now that version of Python is beyond obsolete, and SilentGhost’s code works in all currently-maintained versions of Python, so there’s no longer any reason to recommend the version I had originally posted.
sum(i for i, j in list_of_pairs)
will do too.
If you have a very large list or a generator that produces a large number of pairs you might want to use a generator based approach. For fun I use itemgetter()
and imap()
, too. A simple generator based approach might be enough, though.
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))
Note that itertools.imap()
is available in Python >= 2.3. So you can use a generator based approach there, too.
Obscure (but fun) answer:
>>> sum(zip(*list_of_pairs)[0])
9
Or when zip’s are iterables only this should work:
>>> sum(zip(*list_of_pairs).__next__())
9
I recommend:
sum(i for i, _ in list_of_pairs)
Note:
Using the variable _
(or __
to avoid confliction with the alias of gettext
) instead of j
has at least two benefits:
_
(which stands for placeholder) has better readability
pylint
won’t complain: “Unused variable ‘j'”
Below is sample code, you can also specify the list range.
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
If you don’t mind converting it to a numpy array, you can use np.sum
over axis=0
as given here
s,p=0,0
for i in l:
s=s+i[0]
p=p+i[1]
print(tuple(s,p))
-
enter code here
I have a list of tuples (always pairs) like this:
[(0, 1), (2, 3), (5, 7), (2, 1)]
I’d like to find the sum of the first items in each pair, i.e.:
0 + 2 + 5 + 2
How can I do this in Python? At the moment I’m iterating through the list:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
I have a feeling there must be a more Pythonic way.
In modern versions of Python I’d suggest what SilentGhost posted (repeating here for clarity):
sum(i for i, j in list_of_pairs)
In an earlier version of this answer I had suggested this, which was necessary because SilentGhost’s version didn’t work in the version of Python (2.3) that was current at the time:
sum([pair[0] for pair in list_of_pairs])
Now that version of Python is beyond obsolete, and SilentGhost’s code works in all currently-maintained versions of Python, so there’s no longer any reason to recommend the version I had originally posted.
sum(i for i, j in list_of_pairs)
will do too.
If you have a very large list or a generator that produces a large number of pairs you might want to use a generator based approach. For fun I use itemgetter()
and imap()
, too. A simple generator based approach might be enough, though.
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))
Note that itertools.imap()
is available in Python >= 2.3. So you can use a generator based approach there, too.
Obscure (but fun) answer:
>>> sum(zip(*list_of_pairs)[0])
9
Or when zip’s are iterables only this should work:
>>> sum(zip(*list_of_pairs).__next__())
9
I recommend:
sum(i for i, _ in list_of_pairs)
Note:
Using the variable _
(or __
to avoid confliction with the alias of gettext
) instead of j
has at least two benefits:
_
(which stands for placeholder) has better readabilitypylint
won’t complain: “Unused variable ‘j'”
Below is sample code, you can also specify the list range.
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
If you don’t mind converting it to a numpy array, you can use np.sum
over axis=0
as given here
s,p=0,0
for i in l:
s=s+i[0]
p=p+i[1]
print(tuple(s,p))
-
enter code here