【问题标题】:Iterating through list and getting even and odd numbers遍历列表并获得偶数和奇数
【发布时间】:2021-09-24 06:36:12
【问题描述】:

还有一个我似乎有问题的练习。我会说我做对了,但 Python 更清楚。

任务的主体是:

编写一个接受数字列表或元组的函数。返回一个 二元素列表,分别包含(分别) 偶数索引和奇数索引的总和。所以 调用函数 even_odd_sums([10, 20, 30, 40, 50, 60]) , 你会得到 [90, 120] 。

我的代码是:

def even_odd_sums(sequence):
    sum_list = []
    for i, v in enumerate(sequence):
        if i % 2 == 0:
           sum_list = sum_list.insert(0, sum(v))
        else:
           sum_list = sum_list.insert(1, sum(v))
    return sum_list

print(even_odd_sums([10,20,30,40,50,60]))

结果是:

TypeError                                 Traceback (most recent call last)
<ipython-input-60-14518295929c> in <module>
----> 1 print(even_odd_sums([10,20,30,40,50,60]))

<ipython-input-59-51fcb6e9a115> in even_odd_sums(sequence)
      3     for i, v in enumerate(sequence):
      4         if i % 2 == 0:
----> 5            sum_list = sum_list.insert(0, sum(v))
      6         else:
      7            sum_list = sum_list.insert(1, sum(v))

TypeError: 'int' object is not iterable

我试图在谷歌上找到解决方案,我尝试了其他方法来解决这个任务(“for i in range(len(sequence)),但我就是无法解决不可迭代对象问题

提前致谢!

【问题讨论】:

  • 因为v是来自迭代列表的单个值,所以你不能将它传递给sum,它需要传递一个序列,而不是单个值..
  • 所以我必须不断将值添加到新列表中,以便它可以迭代而不是单个值?

标签: python list loops iteration enumerate


【解决方案1】:

你可以试试:

def even_odd_nums(sequence):
return [sum([item for index, item in enumerate(sequence) if index % 2 == 0]), sum([item for index, item in enumerate(sequence) if index % 2 != 0])]

【讨论】:

    【解决方案2】:

    只需尝试使用切片和索引。这是一个我们都容易忘记使用的好工具。

    def even_odd_sums(lists):
        return [sum(lists[::2]),sum(lists[1::2])]
    

    【讨论】:

      【解决方案3】:

      最简单的方法。使用切片和索引。

      def even_odd_sums(lists):
          return [sum(lists[::2]),sum(lists[1::2])]
      print(even_odd_sums([10,20,30,40,50,60]))
      
      

      【讨论】:

      • 编写一个接受数字列表或元组的函数。返回交替相加和相减数字的结果。所以调用函数 plus_minus([10, 20, 30, 40, 50, 60]) ,你会得到 10+20-30+40-50+60 或 50 的结果。 --------------- 我将如何制作这个?我可以使用您编写的相同方法吗?
      • 是的,你可以。 return [sum(lists[::2])-sum(lists[1::2])]@PreacherBaby
      【解决方案4】:

      正如已经指出的那样,sum 接受一个可迭代的,而不是一个数字。因此,使用循环方法,您可以继续添加正确的总和:

      def even_odd_sums(sequence):
          sum_list = [0, 0]
          for i, v in enumerate(sequence):
              sum_list[i % 2] += v
          return sum_list
      

      或者,您可以对适当的切片进行更简单的求和:

      def even_odd_sums(sequence):
          return [sum(sequence[::2]), sum(sequence[1::2])]
      

      【讨论】:

      • 第二种方法是如此简单和整洁,我不禁想知道为什么我没有首先考虑它。适合初学者吗?
      • 当然,没关系 :) 我想从手动循环方法毕业到如此简洁的解决方案是自然而然的,因为你越来越熟悉一种语言提供给你的所有工具。但是我要注意,从算法上讲,切片方法更糟糕,因为它具有 O(N) 空间复杂度(因为切片创建内存列表),而循环方法具有 O(1) 空间复杂度。
      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2017-02-06
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多