简体   繁体   中英

How to add elements of a list in Python 3.5.5?

My assignment is:

Write a function sumOfPairs that has one parameter of type list. The list can be empty or contain integers. The length of the list must be 0 or an even number. If the length of the list is not 0 and is not even, the function should print an error message and return None. You can assume the list contains only integers. The function returns the list of the sum of each consecutive pair of the numbers in the list. Example: If the list is [1,5,2,10,15,2,9,3], the function returns [6,12,17,12].

My attempt so far is:

def sumOfPairs (list1: list):
    if len(list1) != 0 and len(list1)%2 != 0:
        print ("Error")
        return (None)
    else:
        x = list1.index(int)
        answer = []
        while x<=len(list1):
            newListValue=list1(x)+list1(x+1)
            answer.insert(x,newListValue)
            x=x+2

    return (answer)

print (sumOfPairs ([1,5,2,10,15,2,9,3]))

Yet it yields the following error upon execution:

Traceback (most recent call last):
  File "C:\Users\Andrew\Desktop\lab3.py", line 79, in <module>
    print (sumOfPairs ([1,5,2,10,15,2,9,3]))
  File "C:\Users\Andrew\Desktop\lab3.py", line 71, in sumOfPairs
    x = list1.index(int)
ValueError: <class 'int'> is not in list

How can I fix this?

def sum_of_pairs(l): 
    if len(l) % 2: # if the length of the list mod 2 has a remainder, the list length is uneven
        print("Error, uneven length list")
    else: # else, step through the list in pairs and add each pairing
        return [l[i]+ l[i+1] for i in range(0,len(l),2)] 

In [3]: (sum_of_pairs([1,5,2,10,15,2,9,3]))
Out[3]: [6, 12, 17, 12]

A python function that does not specify a return value as in the if len(l) % 2: will return None by default so we do not need to explicitly return None.

In [11]: l = [1,5,2,10,15,2,9,3]

In [12]: [sum(pair) for pair in zip(l[0::2],l[1::2])]
Out[12]: [6, 12, 17, 12]

I don't particularly like your approach here, but let's take a look at the error specifically.

Traceback (most recent call last):
  File "C:\Users\Andrew\Desktop\lab3.py", line 79, in <module>
    print (sumOfPairs ([1,5,2,10,15,2,9,3]))
  File "C:\Users\Andrew\Desktop\lab3.py", line 71, in sumOfPairs
    x = list1.index(int)
ValueError: <class 'int'> is not in list

Now look at the line it occurs on, and try to say it in English

x equals the first index in list1 where the value is 'int'

Note that it's not the value is AN int ! This is crucial, and is the reason for the error. Your list does not INCLUDE the class int . That would be something like:

[1,2,3,int,5,6,7,8] # not your list

Much easier would be to test that ALL your indices contain ints, then just iterate through the list. Let's try that (even though your exercise says otherwise, partially to keep you from just copy/pasting this!! :D)

def sum_of_pairs(lst: list):
    if len(lst) == 0 or len(lst) % 2 != 0:
        raise ValueError("Invalid list length")
        # makes more sense to raise an exception here than print an error
    if any(not isinstance(int, el) for el in lst):
        # if any element is not an int:
        raise ValueError("Invalid list contents")
    result_list = []
    for element in lst:
        first_el = element
        second_el = next(lst)
        # advance the iterator once to grab the next element
        result_list.append(first_el + second_el) # add them and append
    return result_list

Or even easier if you know how to use the grouper recipe, which is in the pydocs for the itertools module here :

def grouper(iterable, n):
    return zip(*iter([iterable])*n)

def sum_of_pairs(lst: list):
    # validate here, I'm not going to re-write it
    return [sum(pair) for pair in grouper(lst, 2)]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM