Обновление основного словаря с помощью вывода функции без использования обновления словаря

#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 Я пробовал глобальный метод, и он не работает