2011-08-09 29 views
2

我想找到一個處理非常大的有序整數列表的最佳方法,例如。python過濾器計算大值列表中的值以創建多個較小的列表

biglist = [45, 34, 2, 78, 7, 9, 10, 33, 78, 51, 99, 24, 88, ... N] where N > 1m 

通過讀取每個biglist元素來創建固定長度S(〜= 200)的多個小列表,在元件上施加不同的操作,並且如果滿足條件的標準添加的元素或一個值,以每小單子直到達到S,例如。

x_smallist = [] 
y_smallist = [] 
z_smallist = [] 
count = 0 
for i in biglist: 
    b = i/5 
    a = b * 2 
    c = a^3 + b 
    if b > 7 and b < 69: 
     x_smallist.append(i) 
     y_smallist.append(a) 
     z_smallist.append(b) 
     count += 1 
    if count > S: 
     break 

該示例和功能僅用於說明。由於biglist很大,每個元素都被讀取和操作,直到達到S,並且該過程被重複數千次,我想避免for循環。如何通過列表理解(或映射或過濾器)來實現?

+3

如果你正在做這麼多的處理每一個元素,一個),你將無法表達它在一個列表理解,和b)列表理解的時間節省將通過真正相形見絀無論如何你必須做的工作。 –

+0

這最好做爲'for'循環。當你不需要像'a','b'和'count'這樣的中間變量時,列表解析和'過濾器'就是在這裏。我唯一可能的建議是讓元組更加快速,它有一個單元列表,可以將元組附加到:'smallist.append((i,a,b))'。 – agf

+0

似乎是微不足道的prefilter名單。 –

回答

0

我認爲下面的代碼應該做你想做的事情,這個工作是通過讓一個生成器產生一個元組爲每個列表添加一個新元素,然後使用zip創建你想要的三個列表。在開始時創建一個biglist的迭代器,以便每次通過循環時,都會從中斷位置開始拾取,並使用islice,以便發生器停止在S元素處。

itr = iter(biglist) 
while True: 
    lists = itertools.islice(((i, i/5*2, i/5) for i in itr if 7 < i/5 < 69), S) 
    x_smallist, y_smallist, z_smallist = zip(*lists) 
    if len(x_smallist) == 0: 
     break  # reached the end of biglist 
    # do stuff with your small lists 
+0

完美地工作。謝謝! –

0

biglist是否真的必須是一個列表?如果您可以使用生成器創建它們,則可以保存內存,也可以節省一些時間。

+0

biglist可以是任何適當的數據結構,但是元素是預先計算和排序的。 –

0
S = 200 
import itertools 
biglist = itertools.islice(itertools.ifilter(lambda x: 7 < x/5 < 69, biglist),S) 

,或者如果你想多塊只適用於結果ifilter,然後循環。

相關問題