2015-02-09 1 views
0

Я хочу, чтобы пройти через текстовый файл и создать словарь, который имеет ключевые слова и количество раз они всплывают up.I хотят, чтобы это своего рода выглядеть следующим образом:Целые в defaultdict

defaultdict(<type 'int'>, {'keyword1': 1, 'keyword2': 0, 'keyword3': 3, 'keyword4': 9}) 

прямо сейчас получить что-то, что выглядит следующим образом:

defaultdict(<type 'int'>, {'keyword1': 1}) 

Я могу напечатать каждое ключевое слово в моем словаре, как она перебирает, хотя, так что я знаю, что это что-то попробовать. Я также знаю, что больше этих ключевых слов должно появиться, и у них должны быть экземпляры в текстовом файле. Мой код:

find_it=['keyword1', 'keyword2', 'keyword3', 'keyword4'] 

with open('inputfile.txt', 'r') as f: 
    out = defaultdict(int) 

    for key in find_it: 
     counter=0 
     for line in f: 
      if key in line: 
       out[key] += 1 

my_keys=dict(**out) 

Что мне здесь не хватает?

ответ

1

Joran прав, что Counter лучше подходит для того, что вы делаете, чем defaultdict. Вот альтернативное решение:

inputfile.txt

The Zen of Python, by Tim Peters 

Beautiful is better than ugly. 
Explicit is better than implicit. 
Simple is better than complex. 
Complex is better than complicated. 
Flat is better than nested. 
Sparse is better than dense. 
Readability counts. 
Special cases aren't special enough to break the rules. 
Although practicality beats purity. 
Errors should never pass silently. 
Unless explicitly silenced. 
In the face of ambiguity, refuse the temptation to guess. 
There should be one-- and preferably only one --obvious way to do it. 
Although that way may not be obvious at first unless you're Dutch. 
Now is better than never. 
Although never is often better than *right* now. 
If the implementation is hard to explain, it's a bad idea. 
If the implementation is easy to explain, it may be a good idea. 
Namespaces are one honking great idea -- let's do more of those! 

count.py

from collections import Counter 

find_it = {"be", "do", "of", "the", "to"} 

keys = Counter() 

with open("inputfile.txt") as f: 
    for line in f: 
     matches = Counter(w for w in line.split() if w in find_it) 
     keys += matches 

print(keys) 
$ python count.py 
Counter({'the': 5, 'to': 5, 'be': 3, 'of': 3, 'do': 2}) 

Это находит число совпадений против find_it в каждой строке, и добавляет их к счетчику keys как он идет.

EDIT: Как указано в комментариях, предыдущее решение пропустило случаи, когда ключевое слово появляется более одного раза в строке. Измененная версия кода использует несколько иной метод, чем раньше, чтобы преодолеть эту проблему.

+0

Стоит отметить, что это подсчитывает количество строк, на которых появляется каждое слово (это то, что код вопроса также учитывал бы, если бы он работал). Это может быть или не быть желательным. Код Джорана Бисли, напротив, будет подсчитывать количество выступлений каждого слова, независимо от того, какие строки они появляются (так что строка типа «ключевое слово1 ключевое слово2 ключевое слово1» будет увеличивать количество ' «keyword1» - на два). – Blckknght

+0

@Blckknght хороший улов! Исправлено :-) –

3
from collections import Counter 
my_current_count = Counter(open('inputfile.txt').read().split()) 

должен сделать это ... и гораздо проще

for shared_key in set(my_current_count).intersection(my_list_of_keywords): 
    print my_current_count[shared_key] 

в своем нынешнем состоянии слишком много, чтобы сделать, чтобы ваш оригинальный метод, чтобы сделать его работу и по-прежнему узнаваем

+0

это тоже выглядит интересно, и я собираюсь изучить этот метод. Спасибо –

3

Вы уже читают все в файле на первой итерации for key in find_it:, поэтому для следующего ключа читать нечего.

Я бы порекомендовал вам обменять эти петли for.

with open('inputfile.txt', 'r') as f: 
    out = defaultdict(int) 

    for line in f: 
     for key in find_it: 
      if key in line.strip().split(' '): 
       out[key] += 1 

Кстати, я настоятельно рекомендую вам пойти с Joran Beasley's раствором одна линия, как это гораздо легче читать и понимать для тех, кто будет смотреть на ваш код в будущем.

+0

не должен ли он пройти через массив, чтобы найти его? –

+0

Он будет проходить каждое слово в каждой строке и выглядит, если они находятся в 'find_it' – ozgur

+0

О, я вижу, потому что, как только вы проходите через линию, вы не можете вернуться к ней с ключевыми словами, как у меня нет! Спасибо! –