2011-06-03 44 views
2

我有两个文件。调用一个文件作为参考文件。该文件包含一个字符串列表,每个字符串都在一行中。另一个文件是一个输入文件。它也在每一行上都有字符串。 我想从输入文件中的参考文件中找到每个字符串的出现位置。这是我的代码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,并且在这里遇到问题。先谢谢您的帮助。

+3

你可以定义 “不工作?” – Johnsyweb 2011-06-03 10:05:06

回答

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的输入数据

Edition,以便与您输入的问题是你没有正确清洗后的字符\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) 

string.strip功能python收到我想要清理的字符。

对于输入...

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} 
+0

感谢您的回复。问题是我的参考列表显示为 - ['.Net Framework \ n','7-Zip \ n','ACT DCP \ n','ActivePerl \ n','ActiveState Komodo Edit \ n','ActiveTCL \ n','Adobe Flash Player \ n'...等等],我的输入列表显示为 - ['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',....等等。所以例如在输入列表中找不到7-Zip \ n。这是我的问题。 – Sumod 2011-06-03 10:36:21

+0

看到新版本的答案,我希望它修复你的问题。 – 2011-06-03 10:59:34

+0

谢谢。出于某种原因,SO对我来说很糟糕。与此同时,我尝试了这种方法,并为我工作。 ref_list = [string.strip(ref_item)为ref_item在ref_list] input_list = [string.strip(input_item)在input_list input_item] 我会接受你的答案,因为它似乎是一个不错的替代方法。 – Sumod 2011-06-03 14:19:45

相关问题