Сокращение времени выполнения цикла for с использованием всеобъемлющего списка

#python #list #runtime #bigdata #list-comprehension

#python #Список #время выполнения #bigdata #понимание списка

Вопрос:

У меня есть два списка:

 List1 ['i', 'me', 'my', 'myself', 'we']
List2 =  ['i am legend', 'its me time', 'my book is red ', 'i told myself', 'we are thinking about we']
  

Я хочу проверить, сколько раз элемент List1 встречался в List2.

 count = 0
occurance = []
for row in range(len(List1 )):
   for item in range(len(List2 )):
       if List1 [row] in List2 [item]:
           count  = 1 
   occurance.append(count)
   count = 0
result = list(zip(occurance,List1))
  

Этот код работает, и результат
[(5, ‘i’), (1, ‘me’), (2, ‘my’), (1, ‘myself’), (1, ‘we’)]

Проблема:

Размер List2 в реальном мире составляет 82 миллиона. Время выполнения велико, и мне нужно его сократить. Я читал статьи, в которых использование полного списка может помочь сократить время выполнения.

Мои вопросы

  1. Как преобразовать этот код в всеобъемлющий список?
  2. Вы рекомендуете какой-либо другой метод для сокращения времени выполнения?

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

1. Вы уверены, что хотите иметь 5 совпадений для «i»?

2. @antimon Да, это всего лишь пример. Циклы For — главный вопрос

Ответ №1:

Я бы использовал полный словарь, но я не могу заставить его работать полностью. Он хотел бы:

 x = {k:[List2.count(l)] for l in List2 for k in List1}
  

С этого момента действительно легко перейти к списку кортежей.

 y = [(k, v) for k, v in x.items()]
  

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

1. В нем нет оператора if