python — поиск вхождений строк из файла ссылок во входном файле

#python

#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
  

Однако это не работает.
Примечание — Это не проблема HW. Но это часть более масштабной задачи. Также, как ни странно, я реализовал эту часть в Perl, и она работает нормально. Я хочу перевести проект на Python, и здесь у меня возникают проблемы. Заранее спасибо за помощь.

Комментарии:

1. Можете ли вы определить «не работает»?

Ответ №1:

У меня это вроде как работает. Вызывая вашу функцию, подобную …

 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

Итак, проблема с вашим вводом заключается в том, что вы неправильно очищаете конечные символы tn .

Работает следующий код…

 def count_line_occurrences(ref_list,input_list):
  line_counter = {}

  ref_list = map(lambda x: x.strip(" tn"),ref_list)
  input_list = map(lambda x: x.strip(" tn"),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(" tn"),ref_list)
input_list = map(lambda x: x.strip(" tn"),input_list)
  

string.strip Функция в python получает символы, которые я хочу очистить.

Для ввода …

     ref_list = ['.Net Frameworkn', '7-Zipn', 'ACT DCP n', 'ActivePerl n', 'ActiveState Komodo Editn', 'ActiveTCL n', 'Adobe Flash Playern']
    input_list = ['7-Zip 4.57tn', 'WebExtn', 'Adobe Acrobat Reader 8.0.0tn', 'Adobe Flash Player 10 ActiveXt10.0.32.18n']
    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}
  

Комментарии:

1. Спасибо за ответ. Проблема в том, что мой список ссылок отображается как — [‘.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 не может быть найден во входном списке. Это моя проблема.

2. Спасибо. По какой-то причине SO был недоступен для меня. Тем временем я попробовал этот подход, и он сработал для меня. ref_list = [string.strip(ref_item) для ref_item в ref_list] input_list = [string.strip(input_item) для input_item в input_list] Я собираюсь принять ваш ответ, поскольку это кажется хорошим альтернативным подходом.