#python
Вопрос:
Дано:
list1 = [[1,2,1,2,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,1,1]]
Результат должен быть:
{[1,2,1,2,1] : 3, [1,2,1,1,1] : 4}
Уже пробовал
def getDuplicatesWithCount(listOfElems): dictOfElems = dict() for elem in listOfElems: if elem in dictOfElems: dictOfElems[elem] = 1 else: dictOfElems[elem] = 1 dictOfElems = { key:value for key, value in dictOfElems.items() if value gt; 1 } return dictOfElems dictOfElems = getDuplicatesWithCount(tuple(features)) print(dictOfElems)
но получаю ошибку как
TypeError Traceback (most recent call last) ~AppDataLocalTemp/ipykernel_15000/2333321210.py in lt;modulegt; 10 return dictOfElems 11 12 dictOfElems = getDuplicatesWithCount(tuple(features)) 13 print(dictOfElems) ~AppDataLocalTemp/ipykernel_15000/2333321210.py in getDuplicatesWithCount(listOfElems) 2 dictOfElems = dict() 3 for elem in listOfElems: 4 if elem in dictOfElems: 5 dictOfElems[elem] = 1 6 else: TypeError: unhashable type: 'list'
Ответ №1:
Я бы использовал диктант по умолчанию для подсчета случаев, создавая диктант для каждого подсписка:
list1 = [[1,2,1,2,1], [1,2,1,1,1], [1,2,1,1,1], [1,2,1,1,1], [1,2,1,2,1], [1,2,1,2,1], [1,2,1,1,1]] from collections import defaultdict count_dic= defaultdict(lambda : 0) for el in list1: count_dic[tuple(el)] = 1 #{(1, 2, 1, 2, 1): 3, (1, 2, 1, 1, 1): 4})
Ответ №2:
Вы можете использовать itertools.groupby
здесь, если сначала отсортируете список.
from itertools import grouby list1= [[1,2,1,2,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,1,1]] result = {tuple(g):len(list(size)) for g,size in groupby(sorted(l, reverse=True))}
Выход
{(1, 2, 1, 2, 1): 3, (1, 2, 1, 1, 1): 4}
Ответ №3:
list
«ы не могут быть ключами, потому что они изменчивы и, следовательно, не могут быть хэшированы. Вместо этого вы можете попробовать превратить их в tuple
s.
def getDuplicatesWithCount(listOfElems): dictOfElems = dict() for elem in map(tuple, listOfElems): if elem in dictOfElems: dictOfElems[elem] = 1 else: dictOfElems[elem] = 1 return { key:value for key, value in dictOfElems.items() if value gt; 1 }
Или использовать collections.Counter
:
from collections import Counter list1 = [[1,2,1,2,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,1,1]] result = {i: c for t, c in Counter(map(tuple, list1)).items() if c gt; 1}
Результат:
{(1, 2, 1, 2, 1): 3, (1, 2, 1, 1, 1): 4}