我有一个很大的项目列表(这个列表有时可能包含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万件时间。
答案 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万个项而无需将其全部保存在内存中。