我正在寻找像for i in list where i < n
. 我想替换这个烂摊子:
for i in list:
if i < n:
#logic here
有没有更紧凑、更优雅的东西?
我正在寻找像for i in list where i < n
. 我想替换这个烂摊子:
for i in list:
if i < n:
#logic here
有没有更紧凑、更优雅的东西?
我会用一个保护条件来写它以避免缩进层。
for i in list:
if i >= n: continue
单线是这样的:
for i in (k for k in list if k < n):
...
但我认为循环内带有 if 的明显代码更容易理解。
您可以itertools.ifilter
按如下方式使用:
>>> import itertools
>>> inlist = [1,2,3,4,5,6,7]
>>> for i in itertools.ifilter(lambda x: x < 5,inlist):
... print i
1
2
3
4
如果您想要相反的条件,例如大于:
>>> inlist = [1,2,3,4,5,6,7]
>>> for i in itertools.ifilter(lambda x: x > 5, inlist):
... print i
...
6
7
简短的回答:没有。
长答案:
你当然可以这样做:
for i in (a for a in lst if a < n):
# logic
但显然这比您的解决方案要混乱得多。
for i in [x for x in list if x<n]:
pass
在 python 中,你必须使用这种东西while
,for 循环正在迭代list
你刚刚给它的东西。
似乎itertools.takewhile会做你想做的事。
来自母舰:
itertools.takewhile(predicate, iterable)
只要谓词为真,创建一个从可迭代对象返回元素的迭代器。相当于:
def takewhile(predicate, iterable):
# takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
for x in iterable:
if predicate(x):
yield x
else:
break
编辑 !忽略我!正如卡尔所说ifilter(...)
的是正确的解决方案。
takewhile
只像他们在母舰上所说的那样有用:
只要谓词为真,创建一个从可迭代对象返回元素的迭代器。
我会把它改成
仅当谓词为真时,创建一个从可迭代对象返回元素的迭代器。
正如巴菲所说:
我的错。