我有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
感谢
答案 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匿名函数。
我希望我帮助过。