のようなループ構造を探しています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
しかし、明らかにそれはあなたのソリューションよりもずっと面倒です。
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
彼らが母船で言うようにだけ役に立ちます:
述語が真である限り、イテラブルから要素を返すイテレータを作成します。
私はそれを次のように変更します
述語が真である限り、イテラブルから要素を返すイテレータを作成します。
バフィーが言うように:
私の悪い。
for i in [x for x in list if x<n]:
pass
この種のものを使用する必要があるためのpythonwhile
では、forループはlist
あなたが与えたものを繰り返しています。