2017-02-20 107 views
0

我有一個包含數千條記錄的子列表列表。 從列表中的樣本是這樣的:Python中的快速子集子列表

list_full = [ 
    [343, 354,"Sometext1", "Sometext2", "Sometext3"], 
    [43543, 345435,"Sometext1", "Sometext2", "Sometext3"], 
    [4354, 54354,"Sometext1", "Sometext2", "Sometext3", 
     "Sometext4", "Sometext5"] 
] 

我想這個子集主力名單分成兩個單獨的列表。第一個列表應該有來自子列表的前兩個記錄,第二個列表應該包含剩餘的記錄。 作爲一個例子,我需要他們存儲爲:

list_a = [[343, 354], [43543, 345435], [004354, 54354]] 
list_b = [["Sometext1", "Sometext2", "Sometext3"], ["Sometext1", "Sometext2", "Sometext3"], ["Sometext2", "Sometext3", "Sometext4", "Sometext5"]] 

我有以下腳本:

list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

而採用的循環,並且有點慢。有沒有更快的方法來執行此列表子集?謝謝!

+1

從您的問題聲明看起來像您正在使用某種形式的結構化數據的workig。我建議看看熊貓圖書館,因爲它看起來像一個長期的潛在迭代圖書館。它可以讓你執行切片,索引和更多功能。 –

+1

我認爲你目前的做法很好,其他可能的方法(例如列表解析或'map')將需要遍歷'list_full'兩次,而不是一次 –

+0

謝謝你的提示。儘管列表理解似乎更快。 – Litwos

回答

1

我會itertools做lazyly:

import itertools 

list1 = itertools.imap(lambda x: itertools.islice(x, 0, 2), list_full) 
list1 = itertools.imap(lambda x: itertools.islice(x, 2, None), list_full) 

這種方法,直到你需要它的計算將不進行評估。請注意,如果您希望立即對其進行評估,則可以調用list()將itertools對象轉換爲列表。

+0

感謝您的回答。在一小部分數據中,我發現列表理解速度更快。 – Litwos

+0

@Litwos,是的,對於小數據,itertools可能會慢一些,但是當你有大量的時候想想吧:) – Netwave

+0

我在一個更大的子集上再次測試,它比列表理解更快。謝謝 – Litwos

1

試試這個:

# to create two lists 
list_1 = [x[:2] for x in list_full] 
list_2 = [x[2:] for x in list_full] 

# to create two generators, supporting iteration (with for) but not indexing 
list_1 = (x[:2] for x in list_full) 
list_2 = (x[2:] for x in list_full) 

或者,在Python 3,輕鬆遍歷您的數據,而無需創建一個列表:

for a, b, *other in list_full: 
    print("first:", a, b) 
    print("other:", other) 
+0

我不能使用生成器,因爲我需要索引。列表理解是數據子集中最快的。謝謝! – Litwos

1

你可以嘗試列表理解,

list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

基於一些documents列表理解比循環要快得多。

你可以計算出兩者使用timeit方法所用的時間,

from timeit import default_timer as timer 
start=timer() 
list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

print list_1 
print list_2 

end=timer() 

print end-start #Takes 0.0002339 

在使用列表理解,

from timeit import default_timer as timer 
start = timer() 
list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

print list_1 
print list_2 

end = timer() 

print end-start #gives 0.0002105 
+0

我測試了一小部分數據,你的答案是最快的。謝謝! – Litwos

+0

我根據建議對更大的數據樣本進行了測試,並使用itertools證明速度更快。我會考慮更小的子集的列表理解! :) – Litwos