在Python中阅读特定的行序列

2024-09-30 20:36:27 发布

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

我有一个示例文件,如下所示:

    @XXXXXXXXX
    VXVXVXVXVX
    +
    ZZZZZZZZZZZ
    @AAAAAA
    YBYBYBYBYBYBYB
    ZZZZZZZZZZZZ
    ...

我只想读索引4i+2上的行,从0开始。所以我应该阅读上面片段中的VXVXV (4*0+2 = 2)...行和YBYB...(4*1 +2 = 6)行。我需要计算'V's, 'X's,'Y's and 'B's的数量并存储在一个预先存在的dict中

^{pr2}$

有人能解释一下我如何避免偏离索引,只读取行列表中4*I+2索引处的行?在


Tags: and文件示例列表数量dictxxxxxxxxxpr2
3条回答

您可以执行以下操作之一:

从0开始xrange,然后将2添加到辅助循环中的i

for i in xrange(0, len(lines), 4):
    for c in str(lines(i+2))
        if c == 'V':
            some_dict['V'] += 1

从2开始xrange,然后以原始程序中指定的方式访问i

^{pr2}$

你就不能把这一行切成片吗?在

lines = fp.readlines()
interesting_lines = lines[2::4]

为其他质疑其工作原理的人编辑:

“完整”切片语法由三部分组成:start:end:step

start是起始索引,默认为0。因此,对于4*i+2,当i==0时,即为索引#2。在

end是结束索引,默认情况下是len(sequence)。切片到但不包括最后一个索引。在

step是所选项目之间的增量,默认为1。通常,像3:7这样的片将返回元素3、4、5、6(并且不是7)。但是当您添加一个step参数时,您可以执行类似“stepby4”的操作。在

执行“step by 4”意味着start+0, start+4, start+8, start+12, ...,这是OP想要的,只要start参数选择正确。在

我只是想让你清楚地知道你到底在想什么?(在这种情况下,您从一开始就出错了,因为readlines()读取了整个文件。)或者您只是在尝试筛选行列表以选择您想要的行?在

我假设是后者。在这种情况下,最简单的方法就是使用listcomp按索引过滤行。e、 g.一些简单的东西,比如:

indices = [x[0] * 4 + 2 for x in enumerate(lines)]
filtered_lines = [lines[i] for i in indices if len(lines) > i]

现在,你只得到了你想要的行,没有索引错误或类似的傻事。然后,您可以分离并简化剩下的代码来进行计数,只需对筛选后的列表进行操作。在

(只是稍微编辑了一下第一个列表组件,使其更加地道)

相关问题 更多 >