【发布时间】:2014-09-13 16:52:30
【问题描述】:
我有一个简单的任务,即从列表(按降序排序)中选择位于给定元素上方的所有元素。 即
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 )
这种行为背后的原因是什么?
【问题讨论】:
-
x if x>=Threshold else raise StopIteration不是有效的表达式,因为raise StopIteration没有值,因此无法将其添加到列表中。你有什么理由不为此使用循环? -
您应该更仔细地阅读您提到的教程。它回答了您的特定问题(不是有效的表达式)并提到使用 itertools.takewhile 以及使用用户定义的函数 stopif() 来在隐式理解循环中引发 StopIteration 的有点骇人听闻的(IMO)方法——这确实是一个漂亮的很好的教程。