统计不包含特定字符串的列表元素数量

3

我有一个很大的文本文件,包含900000行。我需要计算没有'year1995'和'year1996'的行数。我的做法如下:

fname = r"data.txt"
with open(fname,'r') as fi:
    lines = fi.read().splitlines()
    print len(lines)
    test = [l for l in lines if 'year1995' or 'year1996' not in l]
    print len(test)

但是我的代码没有产生预期的结果。

有什么想法吗?


为什么不直接使用“egrep -v "year1995|year1996" data.txt”?要计数,只需在末尾添加“| wc -l”。 - DevLounge
3个回答

1

创建一个列表然后丢弃它是没有意义的,直接使用sum函数:

with open(fname,'r') as fi:
       print sum(not any(x in line for x in ('year1995','year1996' ) ) for line in fi)

lines = fi.read().splitlines() 这行代码并不需要,直接迭代文件对象即可,每次迭代返回一行。


更好,确实!可能还更节省内存。 - DevLounge
@Apero,def更有效率,除非OP需要列表,但他们似乎不需要,创建两个列表是毫无意义的。 - Padraic Cunningham
但是,正如我在对问题本身的评论中提到的那样,我仍然不会使用Python来处理这个问题。除非OP想要在此部分之后在代码中处理筛选出的行。 - DevLounge

1
你那里的代码会将每一行都放在“test”中。这是因为第一个“if”语句总是会评估为“True”,因为非空字符串为真值。更改推导式中的测试:
[l for l in lines if not ('year1995' in l or 'year1996' in l)]

0

你需要将你的 if 条件改为:

if not 'year1995' in l or not 'year1996' in l

或者

if not ('year1995' in l or 'year1996' in l)

注意:在not操作后面需要加上一个条件!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接