2016-11-11 1 views
0

Существует два списка. Один список называется lst1 = [word1, word2, ......], длина lst более 40000. Другой список, называемый lst2 = [word1, word2, ......], длина lst2 составляет около 10100 Lst2 - это функциональные слова, я хочу получить частоту lst2 слов в lst1. Например:Python3: как быстро вычислить частоту слов в большом списке, если слово этого списка есть или нет в другом списке больших слов

lst1 = ['I', 'am', 'foot', 'girl', 'mom', 'fish', 'mom, 'baby'] 
lst2 = ['mom', 'baby', 'mother']. 

Так частота lst2 слов в lst1: это 'мама': 2, 'ребенок': 1, 'мать': 0. Мой код выглядит следующим образом:

def pronoun_feature(lst1, lst2):
 
    dict_p = {}
  
    for item in lst2:
   
     if item in lst1:
    
      num_item = lst1.count(item)
      
      dict_p.update({item: num_item})
   
     else:
     
      dict_p.update({item: 0})

  
    return dict_p 

Вы знаете длину два моих списка две больших, время вычисления берется около 0.02-0.1s. У вас есть более быстрый способ приблизиться к моему результату. Заранее спасибо!

ответ

1

Вы попробовали Counter?

код выглядит следующим образом:

from collections import Counter 

def pronoun_feature(lst1, lst2): 
    counts = Counter(lst1) 
    dict_p = {} 
    for item in lst2: 
     dict_p[item] = counts[item] 
    return dict_p 

Мы не нужно, если/другое или попробовать/за исключением случая, изделий из lst2 не будучи в lst1 здесь, потому что в соответствии с docs:

объекты счетчик имеет интерфейс словаря кроме того, что они возвращают нулевое количество недостающих элементов, а не поднимая исключение KeyError

+0

благодаря @Maurice, скорость вычислений в 3 раза больше, чем раньше. – tktktk0711

+0

Я рад помочь - функции библиотеки, как правило, намного быстрее, чем ваши собственные реализации :-) – Maurice