【问题标题】:how to only sum a part of elements in a list如何仅对列表中的部分元素求和
【发布时间】:2017-09-26 00:26:54
【问题描述】:

我需要这个函数来返回位于奇数索引处的元素的总和。 这就是我现在所拥有的:

def getSumOdds(aList):
    for element in aList:
        if element % 2 == 1:

【问题讨论】:

  • 欢迎来到 SO。不幸的是,这不是一个学习小组、讨论论坛或代码编写服务。请花时间阅读How to Ask 以及其中引用的链接。
  • 当您发布代码或数据时,请将其格式化 - stackoverflow.com/editing-help#comment-formatting
  • 谁投票决定关闭它,因为它太宽泛了?那个投票可能是错的。确实有几种方法可以做到这一点 - 然而,最 Pythonic 的方法使用内置的 sum 函数,以及与 enumerate 串联的生成器。

标签: python sum


【解决方案1】:

由于您正在执行for element in aListelement % 2 == 1 将检查 每个元素 是否为奇数,而不是其索引是否为奇数。

你可以这样做:

value = 0
for index in range(len(aList)):
    if index % 2 == 1:
        value += aList[value]

这会遍历所有索引,如果是奇数,则将该索引处的元素添加到累加器中。

该方法相当容易理解;但是,它经历了不必要的元素:

value = 0
for index in range(1, len(aList), 2):
    value += aList[index]

range(x, y, z) 生成从x 向上计数到但不包括y 的所有元素,按z 计数。这从 1 开始,每 2 个元素占用一次。

虽然这很长,但可以缩短为以下内容:

value = sum(aList[index] for index in range(1, len(aList), 2))

使用列表切片,其中aList[start:end:jump] 给出从startend 的每个jump-th 元素(最后是隐式),您可以执行以下操作:

value = sum(aList[1::2])

这将从第一个元素开始每隔一个元素求和。

如果您的输入不一定是可索引的(即它是可迭代的但不能使用[index] 语法,例如集合、范围、映射等),您可以这样做:

value = sum(val for index, val in enumerate(anIter) if index % 2 == 1)

这通过获取每个枚举值的索引和值来对索引为奇数的每个值求和。 enumerate 函数是一个返回 (0, a[0]), (1, a[1]), ..., (len(a) - 1, a[-1]) 的可迭代函数。

【讨论】:

  • 注意:您可以处理任意可迭代(可能不可索引)类型with itertools.islice 并避免索引计算。 sum(itertools.islice(anIter, 1, None, 2)) 并且您根本不需要跟踪索引(并且在 C 层有效地处理删除未使用的值以启动)。所以真的,唯一值得考虑速度和简洁性的两个解决方案是实际切片和islice 方法;前者更快,但只是序列,后者更慢,但处理所有可迭代。
  • @ShadowRanger 酷,感谢您提供更多信息!
【解决方案2】:

使用您已经开始的代码,enumerate 可能是您想要返回列表中的计数和值的函数。然后我们过滤奇数索引并将它们添加到总和的变量中,就像您已经完成的那样:

def getSumOdds(aList):
    total = 0
    for index, element in enumerate(aList): 
        if index % 2 == 1:
            total += element
    return total

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print getSumOdds(l) # 20 (odd indices: 2+4+6+8=20)

【讨论】:

    【解决方案3】:

    你可以使用列表切片list[1::2] 或功能

    def getSumOdds(aList):
        return sum(aList[1::2])
    

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 2012-07-05
      • 2022-01-24
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多