计算文本文件中特定值的出现次数

时间:2016-07-16 17:04:56

标签: python text

我有30列的文本文件。并使用python我想根据第3列中的值计算行数。实际上有多少次"水泥"在第3列中出现。列也没有名称(或标题)。

count = 0
with open('first_basic.txt') as infile: 
    for line in infile: 
        for j in (line.split()[3]): 
            if j == "cement": 
                count += 1

感谢

3 个答案:

答案 0 :(得分:0)

您正在检查每行第3列(单词)的每个字符,以检查它是否等于水泥:

'c' == 'cement' => False
'e' == 'cement' => False
etc.

你应该替换

for j in (line.split()[2]): 
    if j == "cement": 
        count += 1

if line.split()[2] == "cement": 
    count += 1

完整代码:

count = 0
with open('first_basic.txt') as infile: 
    for line in infile: 
        if line.split()[2] == "cement": 
            count += 1
print count

答案 1 :(得分:0)

假设您为匹配定义谓词函数:

def match(line):
    return line.split()[2] == 'cement'

您可以将此谓词与filter一起使用,并计算匹配行的数量:

with open('first_basic.txt') as infile: 
    print(len(list(filter(match, infile.readlines()))))

但这需要内存来首先构建list。使用生成器可能更快,并且不需要列表的内存:

    print(sum(1 for line in infile if match(line))

答案 2 :(得分:0)

数组的起始位置为0而不是1.因此,如果你想获得['DUMMY', 'DUMMY', 'CEMENT', 'NOT_CEMENT']的第三个元素,则必须采用[2]位置。因为[3]位置是' NOT_CEMENT'。

而且,第二个是逐字逐句,而不是逐行。你排成一行的行。

所以要修改代码更改:

if line.split()[2] == "cement": #Change here for two
    count += 1

但你可以采取一个干净的解决方案来做这样的事情:

with open('first_basic.txt') as infile: 
    map(lambda x: x.split()[2], infile).count('cement')

让我们解释一下代码。

map()有责任做同样的事情。它将迭代可迭代对象的所有元素。对于每个元素,它都应用一个函数。

使用的功能是:

lambda x: x.split()[2]

这是一种功能性的方法:

def function(x):
    return x.split()[2]

但为什么我用lambda?有一个简单的答案,我不再称这个功能了。所以我不需要在内存中使用空间来使用这个函数,所以我在Python中使用了lambda AKA匿名函数。

您可以查看地图功能here和lambda函数here

我希望我帮助过。