Contando los elementos más comunes en una lista en Python

Estoy tratando de mostrar los n elementos más comunes de una lista pero aparece el error: TypeError: tipo no transitable: ‘list’

import collections test = [[u'the\xa0official', u'MySQL'], [u'MySQL', u'repos'], [u'repos', u'for'], [u'for', u'Linux'], [u'Linux', u'a'], [u'a', u'little'], [u'little', u'over'], [u'over', u'a'], [u'a', u'year'], [u'year', u'ago,'], [u'ago,', u'the'], [u'the', u'offering'], [u'offering', u'has'], [u'has', u'grown'], [u'grown', u'steadily.\xa0Starting'], [u'steadily.\xa0Starting', u'off'], [u'off', u'with'], [u'with', u'support'], [u'support', u'for'], [u'for', u'the'], [u'the', u'Yum'], [u'Yum', u'based'], [u'based', u'family'], [u'family', u'of\xa0Red'], [u'of\xa0Red', u'Hat/Fedora/Oracle'], [u'Hat/Fedora/Oracle', u'Linux,'], [u'Linux,', u'we'], [u'we', u'added'], [u'added', u'Apt'], [u'Apt', u'repos'], [u'repos', u'for'], [u'for', u'Debian'], [u'Debian', u'and'], [u'and', u'Ubuntu'], [u'Ubuntu', u'in'], [u'in', u'late'], [u'late', u'spring,'], [u'spring,', u'and'], [u'and', u'throughout'], [u'throughout', u'all']] print test[0] print type(test) print collections.Counter(test).most_common(3) 

 >>> print collections.Counter(map(tuple,test)).most_common(3) [((u'repos', u'for'), 2), ((u'and', u'throughout'), 1), ((u'based', u'family'), 1)] 

collections.Counter se basa en un diccionario. Como tal, sus claves deben ser hashable, y las listas no son hashable.

Si desea contar cadenas individuales, puede extraer los elementos de cada lista utilizando una expresión generadora, como se muestra a continuación:

 c = collections.Counter(word for pair in test for word in pair) 

Si desea contar los pares, por ejemplo, como 2 gramos, entonces necesita convertir cada lista interna en una tupla (que es hashable) y luego pasarla, lo que nuevamente se puede hacer usando una expresión generadora

 c2 = collections.Counter(tuple(pair) for pair in test) 

Necesita cambiar las listas internas a tuple para que sean hashable

 >>> from collections import Counter >>> c = Counter(tuple(i) for i in test) >>> c.most_common(3) [(('repos', 'for'), 2), (('Hat/Fedora/Oracle', 'Linux,'), 1), (('year', 'ago,'), 1)] 

Como dice el error, la list no es hashable. Otra forma de evitar el problema podría ser ir a través de cadenas: unirse a la lista con un separador (el espacio parece ser una buena opción), luego hacer el recuento y dividir nuevamente:

 >>> [(i.split(' '),j) for i,j in collections.Counter(' '.join(i) for i in test).most_common(3)] [([u'repos', u'for'], 2), ([u'grown', u'steadily.\xa0Starting'], 1), ([u'Linux', u'a'], 1)]