根据项目的长度从列表中选择项目

时间:2013-06-27 12:00:44

标签: python list filter

我有一个很大的项目列表(这个列表有时可能包含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万件时间。

1 个答案:

答案 0 :(得分: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万个而无需将其全部保存在内存中。