2014-10-10 97 views
1

我可以寫在列表中理解的方式下在python如何用Python語言編寫

for row in candidates: 
    sum=0 
    for i in range(1,len(candidates)): 
     if(row[i]!='NA') 
      sum+=int(row[i]) 
    row.append(sum) 

這裏candidates列表理解以下是候選人的列表,其中每個內部列表中包含的候選標記的列表。我所試圖做的是

「我在每個內部列表增加一個成員,這將保持每個候選人的總標記」 像candidate=[[143050023,5,7,6,8],[14305678,3,4,5,6]](在內部0指數有候選的卷數)

我想回答的

[[143050023,5,7,6,8,26],[14305678,3,4,5,6,18]] 

我能夠做同樣的,而不使用列表理解,但面臨的困難,同時與列表理解 ,我面對的是以書面形式如何總結的值,並將其追加到的困難努力每個內部循環之後的行。

當使用列表理解與正常的循環結構相比更好時?

+0

你的意思是'range(1,len(row))'? – univerio 2014-10-10 18:25:25

+0

不......下面的答案是相關的,除了如何追加最後的 – tourism 2014-10-10 18:29:50

+0

在你的內循環中,你試圖總結'row',但是你使用'candidates'的長度而不是'row' 。 – univerio 2014-10-10 18:31:49

回答

5

讓我們先從你的最後一個問題:

使用時相比,正常的循環結構列表理解比較好?

有兩件事必須是真實的:

  • 你的循環的目的是要建立一個列表。
  • 它作爲一種理解而不是一個明確的循環可讀性更高。

請注意,你有兩個嵌套循環。那可能可以轉換成兩個for條款的理解,或嵌套的理解,但它不會轉變成一個單一的理解。

你的內循環有一個問題:理解不應該試圖改變任何東西,並且不能使用賦值或其他語句對任何東西進行變異。所以你需要找到一種方法來重寫它,以便它不變地工作。

在這種情況下,明顯的答案是創建要被總計的值,然後通過將得到的可迭代到對其求和,象內建sum功能的功能:

sum(int(row[i]) for i in range(1, len(row)) if row[i] != 'NA') 

我使用的發電機表達式而不是列表理解,因爲除了循環它之外,我們實際上並不需要列表。

請注意,您可以進一步簡化。你唯一使用i的是(重複)表達row[i]。那麼爲什麼要遍歷索引的範圍,當你可以直接遍歷行呢?

sum(int(value) for value in row if value != 'NA') 

你的外環也有類似的問題:你想變異每個row內循環,而不是建立一個新的結構。而很難想出一個好的替代方案,通過構建新的結構來實現同樣的目標。

當然,你總是可以做的事情在兩個通道:

sums = [sum(int(row[i]) for i in range(1, len(candidates)) if row[i] != 'NA') 
     for row in candidates] 
candidates[:] = [row + [sum] for row, sum in zip(candidates, sums)] 

,您可以通過再次改變sums成生成器表達式取代列表解析倒塌的兩道爲一體,你甚至可以把它變成一個班輪通過就地這樣做,而不是使用一個命名的臨時變量:

candidates[:] = [row + [total] for row, total in zip(candidates, (sum(
    int(row[i]) for i in range(1, len(candidates)) if row[i] != 'NA') 
    for row in candidates))] 

但是這很難說是更具可讀性,甚至遠程接近的可讀性,因爲你原來的版本。

此外,請注意,我稱這個變量持有每個總和total而不是sumsum函數是Python中非常重要的一個內置函數(我們在這個答案中實際使用了一個函數),所以通過創建一個相同名稱的變量來隱藏它是一個壞主意。即使在這種情況下,它只存在於不使用內建的列表理解範圍內,因此對於解釋者來說它並不含糊,對於讀者來說它仍然是模棱兩可的,令人困惑。 (感謝Padraic Cunningham指出了這一點。)

+0

@abarnet kk ....但如何將其附加到行。 – tourism 2014-10-10 18:28:33

+0

@jatinkhurana:我已經編輯了答案,以表明你可以做到這一點的一種方式......但我真的不認爲你想要。 – abarnert 2014-10-10 18:32:37

+0

@thanks ....學習了zip函數的很好用法... – tourism 2014-10-10 18:36:46