Summing first 2 elements in a Python list when the length of the list is unknown

16,354

Solution 1

There is. Two elements of the solution - builtin function sum and lists's slices:

>>> sum([1,2,3][:2])
3
>>> sum([1,1,1,1][:2])
2
>>> sum([1,1][:2])
2
>>> sum([1][:2])
1
>>> sum([][:2])
0

Solution 2

If you can't use sum, one possible solution uses exceptions:

totalsum = 0
try:
  totalsum += nums[0]
  totalsum += nums[1]
except IndexError:
  pass
return totalsum

Catch the error and short-circuit the summation if an element doesn't exist. Easier to ask forgiveness than permission, as they say.

Solution 3

try this:

def sum2(nums):
  if len(nums) == 1:
    return nums[0]
  else:
    return sum(nums [:2])
Share:
16,354
MyCarta
Author by

MyCarta

I am a Geophysicists from Canada (I grew up in Italy). I have a Honors degree in Geology from the University of Rome, Italy, and a Masters degree in Geophysics from the University of Calgary, Alberta. I am also a would-be data scientist, blogger, and independent researcher through my own company, MyCarta, which is involved in visualization and digital mapping of geoscience data. I like to explore methods from other disciplines (at the top of the list medical and forensic image analysis) and adapt them to geo-data. I like Python.

Updated on June 18, 2022

Comments

  • MyCarta
    MyCarta almost 2 years

    I am working on the following Python list exercise from codingbat.com:

    Given an array of ints, return the sum of the first 2 elements in the array. If the array length is less than 2, just sum up the elements that exist, returning 0 if the array is length 0. Examples:

    sum2([1, 2, 3]) → 3 
    
    sum2([1, 1]) → 2
    
    sum2([1, 1, 1, 1]) → 2
    

    My solution below works:

    def sum2(nums):
      if len(nums)>=2:
        return nums[0] + nums[1]
      elif len(nums)==1:
        return nums[0]
      return 0
    

    But I wonder if there's any way to solve the problem with fewer conditional statements.

    • jonrsharpe
      jonrsharpe almost 10 years
      return sum(nums[:2])?
    • MyCarta
      MyCarta almost 10 years
      +1 as it is same solution as answer accepted
  • jonrsharpe
    jonrsharpe almost 10 years
    Those aren't "ranges", they're "slices".
  • Roman Bodnarchuk
    Roman Bodnarchuk almost 10 years
    @jonrsharpe That is true, was remembering the right term.
  • jonrsharpe
    jonrsharpe almost 10 years
    Better to use except IndexError - a "naked" except can catch all kinds of other things (e.g. a TypeError because nums can't be indexed at all or doesn't only contain numbers).
  • MyCarta
    MyCarta almost 10 years
    why do I have to wait 10 minutes to accept the answer?
  • wnnmaw
    wnnmaw almost 10 years
    @MyCarta to make sure you have time to review all the answers that pop up in that time
  • MyCarta
    MyCarta almost 10 years
    Cannot use it because the exercise is structured so that I have to use sum but very interesting, did not know anything exceptions, thank you.
  • MyCarta
    MyCarta almost 10 years
    OK, thank you for the clarification. That makes sense.
  • jonrsharpe
    jonrsharpe almost 10 years
    @MyCarta your first answer wasn't using sum! EAFP is a common Python coding style, worth being aware of.
  • MyCarta
    MyCarta almost 10 years
    OK I tried the code suggested by @TheSoundDefense and it works. Really interesting and I agree worth learning. I could've choosen either answer.