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

时间:2016-02-12 05:36:45

标签: python python-2.7 python-3.x functional-programming

编写一个接受整数列表作为参数的函数。您的函数应返回列表中所有奇数的总和。如果列表中没有奇数,则函数应返回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中的条件和我从主程序调用函数时,首先出现错误。我无法理解这个错误的本质。它只是声明

  

TypeError:并非在字符串格式化期间转换所有参数

6 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

一个。 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异常。

e.g。

>>> 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.

℃。 与实际算法相关

一个。不需要count变量逻辑。

期间无需if循环。

℃。最好将功能编号更改为sumOfOddNumbers,即更有意义。

演示:

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

    return total

d。在其他答案中使用list comprehensionsum方法,lambda函数

电子。 时间运行以下代码:

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

答案 2 :(得分:2)

试试这段代码:

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)

答案 3 :(得分:1)

您的代码适用于Python 2.7但不支持Python 3.x,因为input函数在Python 3中返回一个字符串。更改

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

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

话虽如此,您还可以缩短您的职能:

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

在Python中了解列表推导/生成器表达式后,您还可以使用@minitoto提供的生成器方法进行更优化。

答案 4 :(得分:1)

试试这个:

def odd_number(list_):
  odd_nums = [nums for nums in list_ if nums % 2 != 0]
  if odd_nums:
    return sum(odd_nums)
  else:
    return 0

my_list = range(10)

print (odd_number(my_list))

答案 5 :(得分:1)

理解是一种简洁的语法;为了完整性,还要考虑这个递归函数,

def f(xs):
    if xs == []: 
        return 0
    else: 
        v = 0 if xs[0] % 2 == 0 else xs[0]
        return v + f(xs[1:])

此函数终止,因为它会在每次递归调用时将列表减少一个元素直到空列表。