本当に反復的なアプローチを取りたいのです。
コードはリスト内包表記に置き換えることができます:
invalidLengthNumbers = [num for num in returnNumbers if len(num) < 7 or len(num) > 24]
len()
または、比較チェーンを利用して、より短く、1 つの呼び出しのみを実行します。
invalidLengthNumbers = [num for num in returnNumbers if not 7 <= len(num) <= 24]
しかし、それはわずかに速くなるだけです。
後でループする必要がある場合invalidLengthNumbers
は、中間リストを使用しないでください。直接ループしてフィルタリングしreturnNumbers
ます。おそらくそれreturnNumbers
自体もジェネレーターに置き換えることができ、そのジェネレーターのフィルタリングも繰り返し行うことができます。
def produceReturnNumbers():
for somevalue in someprocess:
yield some_other_value_based_on_somevalue
from itertools import ifilter
for invalid in ifilter(lambda n: not 7 <= len(n) <= 24, produceReturnNumbers()):
# do something with invalid
これで、100 万個のアイテムのリストはなくなりました。すべてをメモリに保持することなく、必要に応じて100 万個のアイテムを生成するジェネレーターがあります。