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

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 に答える
0
for i in [x for x in list if x<n]:
    pass
于 2013-02-02T11:28:30.430 に答える
0

この種のものを使用する必要があるためのpythonwhileでは、forループはlistあなたが与えたものを繰り返しています。

于 2013-02-02T11:28:50.633 に答える