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()或者,利用比较链,更短且只接一个电话:

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 回答