我正在尝试显示列表中n个最常见的项但是收到错误:TypeError:unhashable type:' 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)
答案 0 :(得分:2)
>>> print collections.Counter(map(tuple,test)).most_common(3)
[((u'repos', u'for'), 2), ((u'and', u'throughout'), 1), ((u'based', u'family'), 1)]
答案 1 :(得分:1)
collections.Counter
基于字典。因此,您的密钥需要可以清洗,并且列表不可清除。
如果要计算单个字符串,则可以使用生成器表达式从每个列表中提取元素,如下所示:
c = collections.Counter(word for pair in test for word in pair)
如果你想计算对数,例如2-gram,那么你需要将每个内部列表转换为元组(可以清除),然后传递它,这也可以使用生成器表达式来完成
c2 = collections.Counter(tuple(pair) for pair in test)
答案 2 :(得分:0)
您需要将内部列表更改为tuple
,以便它们可以播放
>>> 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)]
答案 3 :(得分:0)
如错误所述,list
不可清除。绕过问题的另一种方法可能是通过字符串:使用分隔符加入列表(空格似乎是一个不错的选择),然后进行计数并再次拆分:
>>> [(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)]