2017-09-26 93 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

相關問題