使用索引列表访问项列表

13 投票
1 回答
17926 浏览
提问于 2025-04-17 11:05

考虑一下从一个很大的csv文件(80MB)中返回的一大堆带名字的项目(第一行),可能会有一些空白的地方。

name_line =  ['a',,'b',,'c' .... ,,'cb','cc']

我正在逐行读取剩下的数据,只处理那些有对应名字的数据。数据可能看起来像这样:

data_line =  ['10',,'.5',,'10289' .... ,,'16.7','0']

我尝试了两种方法。一种是从每一行中去掉空列。

blnk_cols = [1,3, ... ,97]
while data:
    ...
    for index in blnk_cols: data_line.pop(index)

另一种是从第一行中整理出与名字相关的项目。

good_cols = [0,2,4, ... ,98,99]   
while data:
    ...
    data_line = [data_line[index] for index in good_cols]

在我使用的数据中,好的行肯定会比坏的行多,虽然可能会有一半一半的情况。

我使用了cProfile和pstats这两个工具来找出我程序中速度最慢的部分,结果显示去掉空列的操作是当前最慢的。我换成了列表推导,结果时间几乎翻倍。

我想一个快速的方法是切片数组,只获取好的数据,但对于那些有空白和好数据交替出现的文件,这会比较复杂。

我真正需要的是能够做到:

data_line = data_line[good_cols]

有效地将一组索引传入列表中,以获取那些项目。现在我的程序处理一个10MB的文件大约需要2.3秒,而去掉空列的操作大约占用了0.3秒。

有没有更快的方法来访问列表中的某些位置?在C语言中,这只需要解引用指向数组中正确索引的指针数组。

补充说明:

在读取文件之前的名字行。

a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,

读取并用逗号分割后的名字行。

['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']

1 个回答

12

试试生成器表达式,

data_line = (data_line[i] for i in good_cols)

另外,可以看看这里关于 生成器表达式和列表推导式的区别的内容。

正如最上面的回答所说:'基本上,如果你只是想遍历一次,使用生成器表达式就可以了'。

这样你应该会有所收获。

撰写回答