Python: использовать список в качестве ключа словаря - PullRequest
1 голос
/ 21 апреля 2020

Я уверен, что решение моей проблемы довольно простое, но я не смог его найти.

При запуске я получаю

TypeError: unhashable введите: 'list'

, что ожидается, так как я работаю со списком:

import operator
import shutil

def start(source):
    source=open('Book.txt', 'r', encoding='UTF-8')
    wordslist=[]
    for word in source:
        content=word.lower().split()
        for each_word in content:
            #print(each_word)
            wordslist.append(content)

    #cleanuptext(wordslist)
    sortdictionnary(wordslist)
'''
def cleanuptext(wordslist):
    cleanwords=[]
    for cleanword in wordslist:
        symbols=',.'
        for i in range(0, len(symbols)):
            cleanword = str(cleanword).replace(symbols[i], "")
            if len(cleanword) > 0:
                print(cleanword)
                cleanwords.append(cleanword)
'''
def sortdictionnary(wordslist):
    counter={}
    for word in wordslist:
        if word in counter:
            counter[word] += 1
        else:
            counter[word] = 1
    for key, value in sorted(counter.items(), key=operator.itemgetter(0)):
        print(key, value)
start(source='Book.txt')

Как я могу избежать этой проблемы и иметь возможность использовать свой список в моем словарь?

Даже если я пытался использовать счетчик, у меня возникла та же проблема:

import operator
import shutil
from collections import Counter


def start(source):
    source=open('Book.txt', 'r', encoding='UTF-8')
    wordslist=[]
    for word in source:
        content=word.lower().split()
        for each_word in content:
            #print(each_word)
            wordslist.append(content)

    #cleanuptext(wordslist)
    sortdictionnary(wordslist)
'''
def cleanuptext(wordslist):
    cleanwords=[]
    for cleanword in wordslist:
        symbols=',.'
        for i in range(0, len(symbols)):
            cleanword = str(cleanword).replace(symbols[i], "")
            if len(cleanword) > 0:
                print(cleanword)
                cleanwords.append(cleanword)
'''
def sortdictionnary(wordslist):
    coun = Counter()
    for word in wordslist:
        if word in coun:
            coun[word] += 1
        else:
            coun[word] = 1
    for key, value in sorted(coun.items(), key=operator.itemgetter(0)):
        print(key, value)
start(source='Book.txt')

Спасибо и всего наилучшего

1 Ответ

1 голос
/ 21 апреля 2020

Одна проблема заключается в том, что list являются изменяемыми, и вы не можете использовать изменяемое значение в качестве ключа в словаре. Альтернативой является использование tuple

content = tuple(word.lower().split())

. Чтобы понять причину, по которой Python не требует изменяемых значений, поскольку ключи учитывают, что вы помещаете два разных ключа a и b в словарь с двумя значениями, а затем вы изменяете изменяемый a (первый ключ), так что он становится равным b ... что должно произойти со словарем? В словаре Python не может быть двух одинаковых ключей с разными значениями.

Кортежи допустимы в качестве ключей, поскольку они похожи на списки, но неизменяемы.

...