Подсчет элементов в списке списков с помощью словаря

#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)