2014-02-27 113 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