2014-09-13 59 views
2

我有一個簡單的任務,即從列表中選擇位於給定元素上方的所有元素(按降序排列)。 即python中的列表理解中的循環打破

X=[32,28,26,21,14,11,8,6,3] 
Threshold=12 
Result=[32,28,26,21,14] 

我所做的最初是一些簡單的像

FullList=[x for x in FullList if x>=Threshold] 

然而,由於列表進行排序,我可以(需要)打破之間。

經過很多頭撞擊和一個美麗的教程here,我終於想出了以下解決方案。

def stopIteration(): 
     raise StopIteration 

FullList=list(x if x>=Threshold else stopIteration() for x in FullList) 

然而,當我寫了下面的語句,它給了我一個語法錯誤:

FullList=list(x if x>=Threshold else raise StopIteration for x in FullList) 

什麼是這種行爲背後的原因是什麼?

+0

'X當x> =閾值否則提高StopIteration'不是有效的表達,因爲'提高StopIteration'不具有價值,所以它不能被添加到一個列表。任何理由,你不只是使用循環呢? – khelwood 2014-09-13 08:50:59

+0

你應該仔細閱讀你提到的教程。它會回答你的具體問題(不是一個有效的表達式),並提到使用itertools.takewhile以及使用用戶定義的函數stopif()在隱式理解循環中引發StopIteration的一種有點冒失(IMO)方法 - 它確實是一個漂亮的好教程。 – 2014-09-13 09:15:52

回答

6

raise是一個聲明,但在另一個聲明中,你只能使用表達式。

而且,爲什麼不使用itertools.takewhile?

full_list = list(itertools.takewhile(lambda x: x >= threshold, full_list))