0

大量のアイテムのリストがあります (リストには 100 万個のアイテムが含まれる場合があります)。ここで、各項目の長さに基づいて、このリスト内の要素をフィルター処理したいと考えています。つまり、7 文字未満または 24 文字を超える項目を追加したいと考えています。私が書いたコードは次のとおりです。

returnNumbers //the list that holds million items
for num in returnNumbers:
    if((len(num)<7 or len(num)>24)):
        invalidLengthNumbers.append(num);

100万個のアイテムを処理するには時間がかかるため、これを行うためのより良い方法があるかどうかはわかりません.

4

1 に答える 1

3

本当に反復的なアプローチを取りたいのです。

コードはリスト内包表記に置き換えることができます:

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 万個のアイテムを生成するジェネレーターがあります。

于 2013-06-27T12:03:07.490 に答える