Python - Функция словаря только одна запись для словаря - PullRequest
0 голосов
/ 21 февраля 2020

Извините, если это глупый вопрос, но я новичок в python. У меня есть фрагмент кода, который открывал текст, читая его, создавая список слов, затем из этого списка создавал словарь для каждого слова со счетчиком того, сколько раз оно появляется в списке слов. Этот код работал нормально и печатал словарь нормально, однако, когда я помещал его в функцию и вызывал функцию, он возвращает словарь, но только с одной записью. Любые идеи, поэтому любая помощь очень ценится.

def createDict():

    wordlist = []


    with open('superman.txt','r', encoding="utf8") as superman:
                for line in superman:
                    for word in line.split():
                        wordlist.append(word)
                   #print(word)    



    table = str.maketrans("!#$%&()*+, ./:;<=>?@[\]^_`{|}~0123456789'“”-''—", 47*' ' )


    lenght = len(wordlist)
    i = 0


    while i < lenght:
            wordlist[i] = wordlist[i].translate(table)
            wordlist[i] = wordlist[i].lower()
            wordlist[i] = wordlist[i].strip()
            i += 1


    wordlist = list(filter(str.strip, wordlist))

    word_dict = {}

    for item in wordlist:
             if item in word_dict.keys():
                word_dict[item] += 1
    else:
                word_dict[item] = 1

    return(word_dict)

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020

Исправьте свой отступ в вашей итерации по списку слов. Должен читать:

    for item in wordlist:
        if item in word_dict.keys():
            word_dict[item] += 1
        else:
            word_dict[item] = 1

0 голосов
/ 21 февраля 2020

это похоже на проблему отступов и пробелов. Убедитесь, что операторы if и else в конце вашей функции находятся на одном уровне.

Ниже приведен код, с которым я работал с отступом на правильном уровне. Кроме того, комментарии, чтобы объяснить мыслительный процесс

def createDict():

    wordlist = []


    with open('superman.txt','r', encoding="utf8") as superman:
                for line in superman:
                    for word in line.split():
                        wordlist.append(word)
                   #print(word)    



    table = str.maketrans("!#$%&()*+, ./:;<=>?@[\]^_`{|}~0123456789'“”-''—", 47*' ' )


    lenght = len(wordlist)
    i = 0


    while i < lenght:
            wordlist[i] = wordlist[i].translate(table)
            wordlist[i] = wordlist[i].lower()
            wordlist[i] = wordlist[i].strip()
            i += 1


    wordlist = list(filter(str.strip, wordlist))
    # print(len(wordlist)) # check to see if wordlist is fine. Indeed it is
    word_dict = {}

    for item in wordlist:
        # for dictionaries don't worry about using dict.keys()
        # method. You can use a shorter if [value] in [dict] conditional
        # The issue in your code was the whitespace and indentation
        # of the else statement. 
        # Please make sure that if and else are at the same indentation levels
        # Python reads by indentation and whitespace because it
        # doeesn't use curly brackets like other languages like javascript
        if item in word_dict:
            word_dict[item] += 1
        else:
            word_dict[item] = 1

    return word_dict # print here too

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы. Ура! * * 1006

0 голосов
/ 21 февраля 2020

попробуйте инициализировать словарь вне функции и затем использовать глобальный внутри функции. Это один элемент в словаре последней итерации?

...