Как подсчитать дубликаты списка в 2d-списке в python

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