2017-09-26 38 views
-3

我需要这个函数来返回位于奇数索引处的元素之和。 而这正是我现在所拥有的:如何只加总列表中的一部分元素

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

欢迎来到SO。不幸的是,这不是一个研究组,讨论论坛或代码编写服务。请花时间阅读[问]和其中引用的链接。 – wwii

+0

当您发布代码或数据时,请将其格式化 - https://stackoverflow.com/editing-help#comment-formatting – wwii

+0

谁投票赞成,因为它太宽?那票可能是错位的。有几种方法可以做到这一点,这是真的 - 然而,大多数Pythonic方法使用内置'sum'函数,以及与'enumerate'串联的生成器。 – jrd1

回答

1

使用您已经开始的代码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) 
0

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

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

既然你是做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]给出了start开始每jump个元素最多end(含蓄的尽头)您可以执行以下操作:

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

+0

注意:您可以使用[itertools.islice'](https://docs.python.org/3/library/itertools.html#itertools.islice)处理任意可迭代的(可能不可索引的)类型,并避免索引计算。 'sum(itertools.islice(anIter,1,None,2))'并且你根本不需要跟踪索引(并且在C层有效地处理未使用的值以便引导)。所以真的,唯一值得考虑速度和简洁性的两种解决方案是实际切片和“islice”方法;前者更快,但只有序列,后者更慢但处理所有迭代。 – ShadowRanger

+0

@ShadowRanger酷,感谢您的额外信息! – HyperNeutrino

相关问题