В зависимости от того, как вы собираетесь использовать эту reverseLookup()
функцию, ваш код может оказаться намного счастливее, если вы используете два словарей: создайте первый словарь, как вы уже сделайте, а затем создайте второй словарь, который содержит сопоставления между числом вхождений и словами, которые встречались столько раз. Тогда вашему reverseLookup()
не нужно будет выполнять цикл for k in d.keys()
для при каждом поиске . Этот цикл будет происходить только один раз, и каждый последующий поиск будет выполняться значительно быстрее.
Я собрал (но не тестировал) некоторый код, который показывает, о чем я говорю. Я украл подпрограмму readFile()
Тима, потому что она мне больше нравится, но взял его хороший локальный словарь функций d
и переместил его в глобальный, просто чтобы функции были короткими и приятными. В «реальном проекте» я бы, вероятно, обернул все это в класс, чтобы разрешить произвольное количество словарей во время выполнения и обеспечить разумную инкапсуляцию. Это просто демонстрационный код. :)
import operator
from collections import defaultdict
d = defaultdict(int)
numbers_dict = {}
def readFile(fileHandle):
with open(fileHandle, "r") as myfile:
for currline in myfile:
for word in currline.split():
d[word] +=1
return d
def prepareReverse():
for (k,v) in d.items():
old_list = numbers_dict.get(v, [])
new_list = old_list << k
numbers_dict[v]=new_list
def reverseLookup(v):
numbers_dict[v]
Если вы намереваетесь выполнить два или более поисков, этот код обменяет память на скорость выполнения. Итерация по словарю выполняется только один раз (итерация по всем элементам не является сильной стороной диктата), но за счет дублирования данных в памяти.