2016-03-04 55 views
1

我在hackerrank上看到過很多像這樣的循環,但我仍然不明白它們是如何工作的。爲什麼它有一個常量整數'1'?它不應該是'我'而不是'1'嗎?任何人都可以向我解釋這一點。請解釋這個計算爲數組的python循環,並且是sum()ed

sum (1 for i in l if i >= a and i <= b) 

信貸到期的貸方。我將這個循環從一個非常優雅的解決方案複製到Shashwat的一個問題。問題在於「夏洛克和方形」在hackerrank算法中是好奇的。

+0

試着將其分解爲兩個步驟並將中間結果打印到終端或解釋器中。 'list_to_sum = [1 for i in l if i> = a and i <= b]'這就是傳遞給'sum'的東西。 –

+0

它正在計數符合該條件的列表元素。如果這對你更有意義,你可以將其重寫爲'sum(bool(a <= i <= b)for i in l)'。 – dawg

+4

'sum(1,如果a <= i <= b)'我稍微更習慣於 –

回答

1

在你的例子中,如果項目大於或等於a且項目小於或等於b,則他們基本上爲l中的每個項目添加1。

這基本上等於該代碼:

x = [] 
for i in l: 
    if i >=a and i <= b: 
     x.append(1) 
sum(x) 
1
sum (1 for i in l if i >= a and i <= b) 

這是什麼做的,是要創建僅當條件i >= a and i <= b通行證在遍歷li是你1S的生成器表達式迭代器。

然後,sum將所有的1加在一起。

2

我不知道你的價值,從而讓我們假設:

>>> l = list(range(10)) 
>>> a = 4 
>>> b = 7 

如果你的代碼行分解成幾個步驟,並打印中間結果它更清晰:

>>> [1 for i in l if i >= a and i <= b] 
[1, 1, 1, 1] 

這是傳遞給sum的內容。 (當你離開關方括號它含蓄地變成一臺發電機,但是這是它看起來像一個列表。)

如果你不明白的理解,這是相同的:

>>> result = [] 
>>> for i in l: 
... if i >= a and i <= b: 
...  result.append(1) 
... 
>>> result 
[1, 1, 1, 1] 

總和將相當於將result = []更改爲result = 0result.append(1)result += 1