#python #list #dictionary #typeerror
#питон #Список #словарь #ошибка типа
Вопрос:
Как мне преобразовать этот список списков
[['shall', 'prove'], ['shall', 'not'], ['shall', 'go'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'defend'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'fight'], ['shall', 'never']]
в словарь, который подсчитывает, сколько раз каждый элемент появляется в списке?
т. е. ['shall', 'fight']
появляется 7 раз
Я пробовал такие вещи, как это
def word_counter(input_str): counts = {} for w in input_str: counts[w] = counts.get(w, 0) 1 items = counts.items() word_counter([['of', 'god'], ['of', 'his'], ['of', 'her'], ['of', 'god']])
где я хотел бы, чтобы результат был чем-то вроде
{['of', 'god']: 2, ['of', 'his']: 2, ['of', 'her']: 1}
но я понимаю
TypeError: unhashable type: 'list'
Любая помощь будет очень признательна! В идеале я хотел бы сделать это на базовом Python без необходимости в каких-либо дополнительных библиотеках и т.д. Спасибо
Комментарии:
1. Списки нельзя использовать в качестве ключей диктовки.
2. Что, если бы я сначала преобразовал его в список кортежей, чтобы у меня было что-то вроде [(«из», «бог»), («из», «его»), («из», «ее»), («из», «бог»)]?
Ответ №1:
Вы можете преобразовать элементы списка в str
, чтобы использовать их в качестве ключей в словаре:
def word_counter(input_lst: list[list[str]]) -gt; dict[str, int]: counts: dict[str, int] = {} for pair in input_lst: pair = str(pair) if pair in counts: counts[pair] = 1 else: counts[pair] = 1 return counts # Output: {"['of', 'god']": 2, "['of', 'his']": 1, "['of', 'her']": 1} print(word_counter([['of', 'god'], ['of', 'his'], ['of', 'her'], ['of', 'god']]))
И просто преобразуйте их обратно в список, если это необходимо.
Ответ №2:
Списки являются изменяемыми объектами, они не могут быть хэшированы и, следовательно, не могут использоваться в качестве ключей в словаре. Вы можете использовать кортежи, которые являются неизменяемыми последовательностями, аналогичными спискам. Кроме того, подсчет уже реализован на python в collections
модуле стандартной библиотеки (вам не нужно устанавливать какие-либо дополнительные библиотеки). Вот пример:
import collections original = [('shall', 'prove'), ('shall', 'not'), ('shall', 'go'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'defend'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'fight'), ('shall', 'never')] counts = collections.Counter(original) # counts is a Counter object which is a subclass of dict, but # if you want a normal dict add the line below counts_as_dict = dict(counts)