2014-02-27 214 views
0

我有the Thoracic Surgery datasetthe UCI dataset repository
從這個數據集的單行看起來是這樣的:將列表中的二維列表拆分爲新列表

DGN3,4.36,3.28,PRZ1,F,F,F,T,F,OC12,T,F,F,T,F,59,T 

我有一個腳本讀取這些行成子列表清單:
每個子列表是文件中的行,包含數據的一些改造(主要是,只是把每個元素行成一定數值,這部分是不相關的問題)

因此,每個子列表如下所示:

[3.0, 4.36, 3.28, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 12.0, 1.0, 0.0, 0.0, 1.0, 0.0,59.0, 1.0] 

現在,我想要做的就是把子列表名單成子列表的兩個列表,其中:

  • 第一個列表的i個子列表包含一切,但的的i個子列表的最後一個元素原始列表
  • i第二個列表的第二個子列表只包含原始列表的第i個子列表的最後一個元素。

例如,上面顯示的行(子表)將被分成兩個子列表如下:

[3.0, 4.36, 3.28, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 12.0, 1.0, 0.0, 0.0, 1.0, 0.0,59.0] 
[1.0] 

現在,我知道我可以如下做到這一點很容易:

features, classes = [], [] 
for subl in L: 
    features.append(subl[:-1]) 
    classes.append([subl[-1]]) 

我想知道是否有更好的方法來做到這一點。有沒有可能是一個itertools食譜或somthing出了numpy,會更適合這個?

+0

什麼版本的Python? 'a,* b,c = [1,2,3,4,5,6]'沒有某種新的語法,它會自動分配'b',而不是被'a'抓住並且'C'? – mhlester

+0

@mhlester:很好的問題。不幸的是,我在2.7。我認爲你的意思是來自python3的'a,* b,c = [1,2,3,4,5]'? – inspectorG4dget

+0

是的,當我介紹時我並不積極,但它當然不在2.7上。 drat :( – mhlester

回答

0

您擁有的代碼已經非常好,您可以在處理列表L方面做得最好。您可以縮短這成壓縮列表解析,使之成爲一個班輪但不會降低其複雜性:

>>> L = [[1, 2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12], [13, 14, 15, 16, 17], [18, 19, 20]] 
>>> features, classes = zip(*[(s[:-1], [s[-1]]) for s in L]) 
>>> features 
([1, 2, 3, 4], [6, 7, 8], [10, 11], [13, 14, 15, 16], [18, 19]) 
>>> classes 
([5], [9], [12], [17], [20]) 

如果這個處理時間確實是一個問題,您應該考慮做這些直接與您的數據轉換分開,所以您不會生成中間格式,您最終不會使用它。

+0

吮吸沒有更快的方式。看起來我將不得不在此處引發多處理。謝謝 :) – inspectorG4dget