如何在python中从列表中添加奇数?

2024-04-25 21:50:14 发布

您现在位置:Python中文网/ 问答频道 /正文

编写一个接受整数列表作为参数的函数。函数应该返回列表中所有奇数的和。如果列表中没有奇数,则函数应返回0作为总和。

def odd_numbers (my_list):
    total = 0
    count = 0
    for number in my_list:
        if (number % 2 == 1):
            total = total + number 
        else:
            count = count + 1
    if (number == count):
        return (0)
    else:
        return (total)

#Main Program

my_list = []
n = int(input("Enter the maximum length of a list: "))
while (len(my_list) < n):
    item = input ("Enter integer value to the list: ")
    my_list.append(item)
print ("This is your list: ", my_list)
result = odd_numbers(my_list)
print (result)

这是我的节目。当我执行它时,函数odd_numbers中的if条件一开始和从主程序调用函数时都有一个错误。我不明白这个错误的本质。它只是说

TypeError: not all arguments converted during string formatting


Tags: 函数number列表inputreturnifmycount
3条回答

问题是:当你这样做的时候

item = input("Enter integer value to the list: ")

item是一个字符串。它存储在一个列表中,传递给odd_numbers(),当您到达

if (number % 2 == 1):

当它看到str % something时,它会尝试应用旧式字符串格式(例如,"%04d" % 3会导致"0003")。但是字符串没有任何格式说明符(没有"%"字符),因此它抱怨参数太多,无法放置;-)

为了避免这种情况,请确保将字符串转换为数字

item = int(input("Enter integer value to the list: "))

有点老套的解决方案:

def sum_of_odd_numbers(lst):
    return sum((i*(i%2) for i in lst), 0)

或者更可读的

def sum_of_odd_numbers(lst):
    return sum((i for i in lst if i%2), 0)

或者功能上的等价物

def sum_of_odd_numbers(lst):
    return sum(filter(lambda x: x%2, lst), 0)

请尝试以下代码:

def read_int(msg):
    n = None
    while n is None:
        try:
            n = int(input(msg))
        except ValueError:
            print("You should enter only integer values!")
    return n


def odd_numbers (my_list):
    total = 0
    count = 0
    for number in my_list:
        if (number % 2 == 1):
            total = total + number 
        else:
            count = count + 1
    if (number == count):
        return (0)
    else:
        return (total)

#Main Program

my_list = []
n = read_int("Enter the maximum length of a list: ")

while (len(my_list) < n):
    item = read_int("Enter integer value to the list: ")
    my_list.append(item)


print ("This is your list: ", my_list)
result = odd_numbers(my_list)
print (result)

A.raw_input返回数据类型为string的值,因此需要进行类型转换

>>> item = raw_input("Enter Number:")
Enter Number:2
>>> type(item)
<type 'str'>
>>> item = int(raw_input("Enter Number:"))
Enter Number:4
>>> type(item)
<type 'int'>
>>> 

B.类型转换期间的异常处理如果用户从数字中输入任何其他字符,则上面的代码将引发需要处理的ValueError异常。

例如

>>> item = int(raw_input("Enter Number:"))
Enter Number:w
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'w'

带异常处理的演示:

>>> try:
...     item = int(raw_input("Enter Number:"))
... except ValueError:
...     print "Enter only digits."
... 
Enter Number:rt
Enter only digits.

C.与实际算法相关

不需要变量逻辑。

b.返回值时不需要if循环。

c.最好将函数号改为sumOfOddNumbers,即更有意义。

演示:

def sumOfOddNumbers (numbers_list):
    total = 0
    for number in numbers_list:
        if (number % 2 == 1):
            total += number 

    return total

D.使用list comprehensionsum方法,lambda函数,正如其他答案中提到的那样

E.运行以下代码的时间

lst = range(10000000)

def sum_of_odd_numbers1():
    return sum((i*(i%2) for i in lst), 0)

def sum_of_odd_numbers2():
    return sum((i for i in lst if i%2), 0)

def sum_of_odd_numbers3():
    return sum(filter(lambda x: x%2, lst), 0)

def sumOfOddNumbers ():
    total = 0
    for number in lst:
        if (number % 2 == 1):
            total += number 

    return total

import time
start_time = time.time()
sum_of_odd_numbers1()
end_time = time.time()
print "Timing of sum_of_odd_numbers1:", end_time - start_time

start_time = time.time()
sum_of_odd_numbers2()
end_time = time.time()
print "Timing of sum_of_odd_numbers2:", end_time - start_time

start_time = time.time()
sum_of_odd_numbers3()
end_time = time.time()
print "Timing of sum_of_odd_numbers3:", end_time - start_time

start_time = time.time()
sumOfOddNumbers()
end_time = time.time()
print "Timing of sumOfOddNumbers:", end_time - start_time

各自输出:

vivek:~$ python /home/vivek/workspace/vtestproject/study/timer.py
Timing of sum_of_odd_numbers1: 2.4171102047
Timing of sum_of_odd_numbers2: 1.73781108856
Timing of sum_of_odd_numbers3: 2.09230113029
Timing of sumOfOddNumbers: 1.42781090736

相关问题 更多 >

    热门问题