【问题标题】:How to add odd numbers from a list in python?如何从python中的列表中添加奇数?
【发布时间】:2016-02-13 06:52:11
【问题描述】:

编写一个接受整数列表作为参数的函数。您的函数应该返回列表中所有奇数的总和。如果列表中没有奇数,您的函数应返回 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:字符串格式化期间并非所有参数都转换

【问题讨论】:

  • 你为什么要同时标记python-2.7python-3.x?您真的在两个版本中都遇到同样的错误吗?
  • if (number == count) 是干什么用的?在循环之后,number 是列表中的最后一个元素,而count 是偶数的计数。 number == count 如何告诉你列表中没有奇数?
  • @Barmar 他打算写if (count == 0),但即使这样也是多余的,因为total 无论如何都会为零。
  • @Selcuk 这甚至不是正确的测试。 count偶数个数,他应该数奇数个数。
  • 你是对的,if count == len(my_list) 也许。

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


【解决方案1】:

问题是:当你这样做时

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)

【讨论】:

  • 太棒了,为sum((i*(i%2) for i in lst), 0)点赞。
  • 这绝对是一个聪明的方法,但我认为filter -&gt; sum 是“最好的”方法。另外,我在手机上,但我认为sum 的默认第二个参数是0,所以可以省略。具有讽刺意味的是,我认为生成器方法是最快的,因为它避免了乘法和函数调用。
  • 根据性能正常的for循环,在`if`循环中,然后将数字添加到总数中更快,因为在列表理解中我们创建列表并在sum方法中再次迭代列表以进行添加.
【解决方案2】:

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. 与实际算法相关

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

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

【讨论】:

    【解决方案3】:

    试试这个代码:

    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)
    

    【讨论】:

    • 欢迎使用 stackoverflow 投票。在n = int(input("Enter the maximum length of a list: ")) 中做同样的异常处理
    【解决方案4】:

    您的代码适用于 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 提供的生成器方法进行更多优化。

    【讨论】:

      【解决方案5】:

      试试这个:

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

      【讨论】:

        【解决方案6】:

        A for comprehension 带来简洁的语法;为了完整起见,还要考虑这个递归函数,

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

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

        【讨论】:

          猜你喜欢
          • 2014-01-10
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多