按列2d列表拆分为新列表

时间:2014-02-27 22:28:08

标签: python list python-2.7 numpy split

the Thoracic Surgery dataset来自the 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配方或numpy的东西更适合这个?

1 个答案:

答案 0 :(得分: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])

如果处理时间确实存在问题,您应该考虑直接对数据转换进行这些拆分,因此您不会生成最终不会使用的中间格式。