python - 在输入文件中查找参考文件中的字符串出现次数
我有两个文件。一个文件叫做参考文件,这个文件里有一堆字符串,每个字符串占一行。另一个文件是输入文件,它也每行都有字符串。
我想要找出参考文件里的每个字符串在输入文件中出现的次数。这是我的代码:
def count_line_occurrences(ref_list,input_list):
line_counter = {}
# Initialization
for ref_line in ref_list:
ref_line = ref_line.rstrip()
line_counter[ref_line] = 0
for input_line in input_list:
input_line = input_line.rstrip()
for ref_line in ref_list:
#print ref_line
for input_line in input_list:
#print input_line
if str(input_line).find(str(ref_line)) != -1:
print 'found ' + ref_line
line_counter[ref_line] += 1
return line_counter
不过这个代码没有正常工作。需要说明的是,这不是一个作业问题,而是一个更大任务的一部分。而且奇怪的是,我在Perl语言中实现的这个部分是可以正常工作的。我想把这个项目转到Python上,但在这里遇到了一些问题。提前谢谢大家的帮助。
1 个回答
3
对我来说,这个方法有点用。像这样调用你的函数...
if __name__ == "__main__":
x = count_line_occurrences(["a","b","c"],["c","c","b","a"])
print x
会输出...
found a
found b
found c
found c
{'a': 1, 'c': 2, 'b': 1}
@Sumod ... 这不是预期的结果吗?
在看到@Sumod的输入数据后更新
你输入的问题在于没有正确清理掉末尾的字符 \t\n
。
下面的代码可以正常工作...
def count_line_occurrences(ref_list,input_list):
line_counter = {}
ref_list = map(lambda x: x.strip(" \t\n"),ref_list)
input_list = map(lambda x: x.strip(" \t\n"),input_list)
# Initialization
for ref_line in ref_list:
line_counter[ref_line] = 0
for ref_line in ref_list:
#print ref_line
for input_line in input_list:
#print input_line
if str(input_line).find(str(ref_line)) != -1:
print 'found ' + ref_line
line_counter[ref_line] += 1
return line_counter
注意,在初始化你的计数器之前,我先对两个输入列表进行了清理...
ref_list = map(lambda x: x.strip(" \t\n"),ref_list)
input_list = map(lambda x: x.strip(" \t\n"),input_list)
在Python中,string.strip
函数可以接收我想要清理的字符。
对于输入...
ref_list = ['.Net Framework\n', '7-Zip\n', 'ACT DCP \n', 'ActivePerl \n', 'ActiveState Komodo Edit\n', 'ActiveTCL \n', 'Adobe Flash Player\n']
input_list = ['7-Zip 4.57\t\n', 'WebEx\t\n', 'Adobe Acrobat Reader 8.0.0\t\n', 'Adobe Flash Player 10 ActiveX\t10.0.32.18\n']
x = count_line_occurrences(ref_list,input_list)
print x
我得到了...
{'ActiveState Komodo Edit': 0, '.Net Framework': 0, 'ACT DCP': 0, 'ActivePerl': 0, 'Adobe Flash Player': 1, '7-Zip': 1, 'ActiveTCL': 0}