2

如何忽略文件中的行?

例子:

如果您知道文件中的第一行将以 a 或 b 开头,其余行以 c 结尾,那么如何解析文件以便忽略以 a 或 b 开头的行并将以 c 结尾的行转换为 a嵌套列表?

到目前为止我所拥有的:

fname = raw_input('Enter file name: ')

z = open(fname, 'r')

#I tried this but it converts all lines to a nested list

z_list = [i.strip().split() for i in z]

我猜我需要一个for循环。

for line in z:
    if line[0] == 'a':
        pass
    if line[0] == 'b':
        pass
    if line[-1] == 'c':
        list_1 = [line.strip().split()]

以上是总体思路,但我是制作死代码的专家!怎么把它变成不死生物?

4

6 回答 6

9

startswith可以接受一个字符串元组来匹配,所以你可以这样做:

[line.strip().split() for line in z if not line.startswith(('a', 'b'))]

即使 a 和 b 是单词或句子而不仅仅是字符,这也将起作用。如果可能存在行不以 a 或 b 开头但也不以 c 结尾的情况,您可以将列表理解扩展为:

[
    line.strip().split()
    for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]
于 2009-12-19T00:57:51.097 回答
3

一种非常通用的方法是通过删除一些行来“过滤”文件:

import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]

您可以在itertools.ifilter任何时候使用您想要“选择性过滤”一个可迭代对象,获得另一个仅包含满足某些谓词的项目的可迭代对象——这就是我说这种方法非常通用的原因。 itertools有很多很棒的、快速的工具可以用无数种方式处理迭代,非常值得学习。

一种类似但语法上更简单的方法,在您的情况下就足够了(因此由于简单性,我会推荐),是使用iflistcomp 中的一个子句进行“过滤”:

zlist = [l.strip.split() for l in z if l[0] not in 'ab']
于 2009-12-19T01:00:00.067 回答
2

您可以if向列表推导添加条件。

z_list = [i.strip().split() for i in z if i[-1] == 'c']

或者

z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]
于 2009-12-19T00:52:17.693 回答
1

一种方法是将“通过”替换为“继续”。这将继续到文件中的下一行而不做任何事情。您还需要将行附加到 list_1

if line[-1] == 'c':
    list_1.append([line.strip().split()])
于 2009-12-19T00:50:05.417 回答
0
f=open("file")
for line in f:
   li=line.strip()
   if not li[0] in ["a","b"] and li[-1]=="c":
      print line.rstrip()
f.close()
于 2009-12-19T01:07:59.783 回答
0

对于那些对解决方案感兴趣的人。

还有,另一个问题!

示例文件格式:

c this is a comment
p m 1468 1 267
260 32 0
8 1 0

代码:

fname = raw_input('Please enter the name of file: ')

z = open(fname, 'r')

required_list = [line.strip().split() for line in z if not line.startswith(('c', 'p'))]

print required_list

输出:

[['260', '32', '0'], ['8', '1', '0']]

关于如何将列表中的字符串转换为整数并执行算术运算的任何建议?

伪代码来说明:

#for the second item in each sublist
     #if sum is > than first number in second line of file
         #pass
     #else
         #abort/raise error

到目前为止,为您的建议干杯,Seafoid。

@Nadia,我的一天现在似乎更有价值了!我花了几个小时(甚至几天)试图破解这个独奏!谢谢!

于 2009-12-19T01:50:05.860 回答