我正在寻找像for i in list where i < n
这样的循环结构。我想取代这个烂摊子:
for i in list:
if i < n:
#logic here
是否有更紧凑,更优雅的东西?
答案 0 :(得分:2)
我会用保护条件写它以避免压痕层。
for i in list:
if i >= n: continue
这是一个单行:
for i in (k for k in list if k < n):
...
但是我觉得循环中if的明显代码更容易理解。
答案 1 :(得分:2)
您可以按如下方式使用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
答案 2 :(得分:1)
简短回答:不。
答案很长:
你当然可以这样做:
for i in (a for a in lst if a < n):
# logic
但显然这比你的解决方案更麻烦。
答案 3 :(得分:0)
for i in [x for x in list if x<n]:
pass
答案 4 :(得分:0)
在python中,你必须使用while
这样的东西,for循环正在迭代你刚给它的list
。
答案 5 :(得分:0)
似乎itertools.takewhile会做你想做的事。
来自母舰:
itertools.takewhile(predicate, iterable)
创建一个迭代器,只要谓词为true,就从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
编辑 !忽略我!,因为Karl说ifilter(...)
是正确的解决方案。
takewhile
只有在他们对母舰的说法时才有用:
只要谓词为真,就创建一个从迭代中返回元素的迭代器。
我将其改为
只要谓词为真,就创建一个只从可迭代 返回元素的迭代器。
正如巴菲所说:
我的坏。