具有双重条件的for循环

时间:2013-02-02 11:24:39

标签: python code-readability

我正在寻找像for i in list where i < n这样的循环结构。我想取代这个烂摊子:

for i in list:
    if i < n:
        #logic here

是否有更紧凑,更优雅的东西?

6 个答案:

答案 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只有在他们对母舰的说法时才有用:

  

只要谓词为真,就创建一个从迭代中返回元素的迭代器。

我将其改为

  

只要谓词为真,就创建一个只从可迭代 返回元素的迭代器。

正如巴菲所说:

  

我的坏。