Целые числа в 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)
Что мне здесь не хватает?
3 ответа
Джоран прав, что 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
как это происходит.
РЕДАКТИРОВАТЬ: Как указано в комментариях Blckknght, предыдущее решение пропустило случаи, когда ключевое слово встречалось в строке более одного раза. Отредактированная версия кода использует немного другой метод, чем прежде, чтобы преодолеть эту проблему.
Вы уже читаете все в файле на первой итерации 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
Кстати, я настоятельно рекомендую вам использовать однострочное решение Джорана Бизли, так как его легче читать и понимать всем, кто будет смотреть на ваш код в будущем.
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]
в его текущем состоянии слишком много нужно сделать с вашим оригинальным методом, чтобы он работал и оставался узнаваемым