2013-06-27 87 views
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); 

不知道是否有這樣做的更好的方法,如去直通百萬的項目是時間服用。

回答

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萬項根據需要而不是全部在內存中。

+1

+1。順便說一句,否定'if len(num)<7或len(num)> 24'將是'如果不是7 <= len(num)<= 24「。我發現稍微更可讀... – mata

+0

@mata:確實;否定給了我們一次連鎖和只調用len()的機會。謝謝。 –