#python #dictionary
#python #словарь
Вопрос:
Это мой следующий код
import os
import string
#(Function A) - that will take in string as input and update the master dictionary
def counter(file):
word_counter = dict()
f = open(file, "rt")
words = f.read().split()
words= filter(lambda x: x.isalpha(), words)
for word in words:
if word in word_counter:
word_counter[word] = 1
else:
word_counter[word] = 1
return word_counter
# outside of Function
master = dict()
filelist=[os.path.join('medline',f) for f in os.listdir('medline')]
for file in filelist:
master.update(counter(file))
#Function B - Passed the mass dictionary A and outputed the top 3 words
def sort_dict(A):
remove_duplicate = []
new_list = dict()
for key, val in A.items():
if val not in remove_duplicate:
remove_duplicate.append(val)
new_list[key] = val
new_list = sorted(new_list.items(), key = lambda word_counter: word_counter[1], reverse = True)
print (f'Top 3 words for the master dictionary:', new_list[:3])
sort_dict(master)
Проблема в том, что я не могу использовать функцию обновления (правило головоломки).
Мне нужно обновить основной словарь, который находится за пределами этих функций, с помощью выходного словаря, сгенерированного из каждого файла в каталоге, который я просматриваю (функция A). Мне разрешено использовать только эти модули, и я не могу преобразовать его в список, чтобы добавить их, а затем создать из них словарь. Я действительно застрял на этой проблеме и не уверен, как получить вывод, который я получаю из функции A, в словарь, который я могу использовать для функции B, не нарушая правил.
Ответ №1:
Вы не описали фактические требования, но я подозреваю, что вам нужно количество слов во всех файлах. Ваше использование update()
заменит количество слов его количеством из следующего файла, содержащего слово, и в итоге каждое слово будет учитываться только из его последнего файла.
Вам нужно добавить счетчик из текущего файла к значению, которое уже есть в словаре.
for file in filelist:
for key, val in counter(file).items():
master[key] = master.get(key, 0) val
Вы также можете сделать это в самой counter()
функции, а не возвращать словарь.
def counter(file):
f = open(file, "rt")
words = f.read().split()
words= filter(lambda x: x.isalpha(), words)
for word in words:
master[word] = master.get(word, 0) 1
Вместо использования if key in master:
вы можете использовать master.get()
значение по умолчанию.
Комментарии:
1. Я подозреваю , что «головоломка» ожидает, что пользователь изменит глобальный
master
dict.2. Разве это не то, что это делает?
3. Я имею в виду внутри,
counter
иначе я не могу понять некоторые произвольные ограничения, такие как «вы не можете использоватьmaster.update
«.4. Теперь, когда я думаю об этом, я подозреваю, что он должен объединить подсчеты по всем файлам. Это просто приведет к подсчету из последнего файла, содержащего каждое слово.
5. @juanpa.arrivillaga Я пробовал глобальный метод, и он не работает