带索引列表的项目访问列表

2024-10-05 10:38:29 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一个大型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)

另一个是编译与来自L1的名称相关联的项

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

在我使用的数据中,肯定会有更多的好行,而不是坏行,尽管它可能高达一半。

我使用cProfile和pstats包来确定速度上最薄弱的环节,这表明pop是当前速度最慢的项目。我换了单子,时间几乎翻了一番。

我认为一种快速的方法是对数组进行切片,只检索好的数据,但是对于交替使用空白和好数据的文件来说,这会很复杂。

我真正需要的是

data_line = data_line[good_cols]

有效地将索引列表传递到列表中以取回这些项。 现在,我的程序运行大约2.3秒,对于一个10 MB的文件,pop帐户运行大约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']

Tags: 文件数据方法名称列表fordataindex
1条回答
网友
1楼 · 发布于 2024-10-05 10:38:29

试试生成器表达式

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

也可以在这里阅读 Generator Expressions vs. List Comprehension

正如上面的答案告诉你的:“基本上,如果你所做的只是迭代一次,就使用生成器表达式。”。

所以你应该从中受益。

相关问题 更多 >

    热门问题