0

我正在寻找像for i in list where i < n. 我想替换这个烂摊子:

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

有没有更紧凑、更优雅的东西?

4

6 回答 6

2

我会用一个保护条件来写它以避免缩进层。

for i in list:
    if i >= n: continue

单线是这样的:

for i in (k for k in list if k < n):
    ...

但我认为循环内带有 if 的明显代码更容易理解。

于 2013-02-02T11:27:34.627 回答
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
于 2013-02-02T11:37:42.077 回答
1

简短的回答:没有。

长答案:

你当然可以这样做:

for i in (a for a in lst if a < n):
    # logic

但显然这比您的解决方案要混乱得多。

于 2013-02-02T11:28:14.017 回答
0
for i in [x for x in list if x<n]:
    pass
于 2013-02-02T11:28:30.430 回答
0

在 python 中,你必须使用这种东西while,for 循环正在迭代list你刚刚给它的东西。

于 2013-02-02T11:28:50.633 回答
0

似乎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只像他们在母舰上所说的那样有用:

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

我会把它改成

当谓词为真时,创建一个从可迭代对象返回元素的迭代器。

正如巴菲所说:

我的错。

于 2013-02-02T11:51:48.573 回答