2015-04-22 69 views
1

在CheckIO練習中工作,但卡在這裏。我需要設計一個函數,它可以找到具有偶數索引的元素的總和(0,2,4 ...),然後將這個總和數和數組的最後一個元素相乘。輸入是一個數組,輸出是一個數字。哦,對於一個空數組,結果必須爲零。涉及列表和索引的基本Python練習的麻煩

def checkio(array): 
    sum = 0 
    if len(array) == 0: 
     return 0 
    else: 
     for i in array:  
      if array.index(i) % 2 == 0: 
       sum = sum + i 
     final = sum*(array[len(array)-1]) 
    return final 

例如,與陣列[-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41],這個函數返回-1476時,應當給予了1968

+0

'如果len(數組)== 0:'可以縮短爲'如果數組:',並且你不必使用別的如果你返回if if –

+2

@TimCastelijns我不認爲它是一個對於那些沒有深入解釋的人來說,這是一個好主意。特別是當它是'如果不是陣列';) – ThinkChaos

+0

@ThinkChaos我不認爲這需要一個深入的解釋,它是基本的python –

回答

1

這是我制定的工作計劃。

def checkio(array): 
    listSum = 0 

    if array: 

     for i in range(0, len(array), 2): 
      listSum += array[i] 

     finalValue = listSum * array[-1] 

     return finalValue 
    else: 
     return 0 

首先,它檢查數組是否有任何值。我們可以這樣做:if array:。如果數組是空的,它會像你想要的那樣返回0。

現在,這是什麼檢查您的數組中的每個其他元素:range(0, len(array), 2):這意味着i的值將從0開始,繼續爲數組的長度,並按兩個計數。

總和加在這裏:listSum += array[i]。這將採用變量listSum並將數組中的索引i處的數字值添加到該變量中。 +=運營商是listSum = listSum + array[i]的簡寫。

該函數的最後一部分取listSum變量,並將其乘以array[-1],得到數組中的最後一個值,finnaly將其返回。

當我運行上面的示例數組時,它應該返回1968。

+0

這非常清楚。 – SpicyClubSauce

+0

謝謝,如果您發現它最有幫助和簡潔,請接受它。 –

3

據我所看到的問題是,你假設數組中的所有數字都是唯一的。例如讓我說我有以下數組:

[0,33,33,22,22] 

顯然在這個數組中你需要第3和第5個元素(索引2和4)。

與您現有的代碼然而,這絕不會發生,你將最終爲0的總和。這是因爲代碼:

array.index(i) 

發現匹配i的第一要素,這將是第二次和第四個元素(索引1和3),它們是奇數索引,因此不會被添加。

+0

注意:在OP的數組中,84出現兩次,其餘都是唯一的 –

+1

等待,我們需要第一個和第三個元素,因爲我們希望具有偶數索引的元素([0],[2])...如果示例數組類似於[10,11,11,12],這種解釋會不會更有意義?然後11將不會被添加到總和中,因爲第一個索引總是返回[1],而不是[2],並且1不是偶數。 – SpicyClubSauce

+0

@SpicyClubSauce修正了對於混淆 –

2

您可以使用列表Comprehension。像:

sum([i for i in L[::2]])*L[-1] 

在您的代碼array.index(i)是問題。所以,你可以通過使用array[::2]

用於查找元素您可以與您的代碼嘗試:

def checkio(array): 
    sum = 0 
    if len(array) == 0: 
     return 0 
    else: 
     for i in array[::2]:  
      sum = sum + i 
     final = sum*array[-1] 
    return final 

例子:

L = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41] 

Output:  
1968 
+0

或者如果最後一個元素不被支持是sum的一部分,sum([i for L [: - 1:2]])* L [-1]。 – dhke

+2

這很棒,但是OP也對他自己的代碼爲什麼不起作用感興趣 –

+0

::在列表理解中意味着什麼? – SpicyClubSauce

0

只是用枚舉來interate每個元素與索引,並保持跟蹤最後一個元素。

def checkio(array): 
    sum = 0 
    last_element = 0 

    for index, element in enumerate(array): 
     if index % 2 == 0: 
      sum += element 
     last_element = element 

    return last_element * sum 
1

我認爲這是爲了給一些初學者的解釋,即使我不停地重複那些已經說其他答案:

至於爲什麼你的代碼不能正常工作,讓我們改變原來的一點:

def checkio(array): 
    sum = 0 
    if len(array) == 0: 
     return 0 
    else: 
     for i in array: 
      print "pos of %s = %i" % (i, array.index(i)) 
      if array.index(i) % 2 == 0: 
       sum = sum + i 
      final = sum*(array[len(array)-1]) 
    return final 

這就產生

pos of -37 = 0 
pos of -36 = 1 
pos of -19 = 2 
pos of -99 = 3 
[...] 
pos of 84 = 9 
[...] 
pos of 84 = 9 

有你的問題,因爲index()產生的元素,中第一次出現的索引出現兩次。只有當數組中的元素是唯一的時候,你的代碼才能工作。

所以,當不打算使用切片的所有出蟒蛇招搖:

def checkio(array): 
    # sum is a built-in, don't override it 
    result = 0 
    # "if len(array) != 0" is the same as "if array" 
    if array: 
     # enumerate is nice, but not really needed, see below 
     for i, x in enumerate(array):  
      # i is the index, x is the value 
      if i % 2 == 0: 
       # += is also nice 
       result += x 
     result *= array[-1] 
    return result 

至於更Python化的解決方案,你可以做很多與slicing

array[::2] 

array

array[-1] 

每第二個元素是最後一個元素。因此

s = sum(array[::2]) * array[-1] 

即不處理空數組,從而

# if there are no elements or only the last element, the sum is zero 
if len(array) == 0: 
    return 0 
else: 
    return sum(array[::2]) * array[-1] 

甚至

return sum(array[::2]) * array[-1] if array else 0 

哪個python的等效三元運算符的。