我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的东西更适合这个?
答案 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])
如果处理时间确实存在问题,您应该考虑直接对数据转换进行这些拆分,因此您不会生成最终不会使用的中间格式。