我有这个代码,我从一些教程-:
list1 = [['hello','there','you','too'],['hello','there','you','too','there'],['there','you','hello']]
def get_shingle(size,f):
#shingles = set()
for i in range (0,len(f)-2+1):
yield f[i:i+2]
#shingles1 = set(get_shingle(list1[0],2))
#shingles2 = set(get_shingle(list1[1],2))
shingles1 = set(get_shingle(2,list1[0]))
shingles2 = set(get_shingle(2,list1[1]))
print shingles1
print shingles2
print "done"
当我尝试运行此代码时,我得到一个错误-:
Traceback (most recent call last):
File "E:ResearchShingle Methodcreate_shingle.py", line 10, in <module>
shingles1 = set(get_shingle(2,list1[0]))
TypeError: unhashable type: 'list'
如果设置了list1,则不会出现错误。但是我不能将list1转换为,它删除了重复的单词,我还需要它是我的主要代码的列表,它以列表的形式处理一个巨大的文本文件。为什么我得到这个"不可哈希列表"?我们不能将list作为参数传递吗?
问题在于get_shingle()函数产生lists
。列表是不可哈希的,这是构建集合所必需的。您可以通过生成一个元组(它是可哈希的)而不是列表来轻松解决这个问题。
在代码中转换以下行:
yield tuple(f[i:i+2])
这将导致以下结果:
list1 = [['hello','there','you','too'],['hello','there','you','too','there'],['there','you','hello']]
def get_shingle(size,f):
#shingles = set()
print(f)
for i in range (0,len(f)-2+1):
yield tuple(f[i:i+2])
shingles1 = { i for i in get_shingle(2,list1[0])}
print(shingles1)
和输出:
['hello', 'there', 'you', 'too']
{('you', 'too'), ('hello', 'there'), ('there', 'you')}
因为yield
命令返回一个生成器。将生成器转换为集合将触发不可哈希类型错误。
你可以通过一个简单的修改使你的代码工作。
shingles1 = get_shingle(2,list1[0])
lst = [x for x in shingles1]
这将为您提供list1[0]
中的所有重字符,并将其放入lst
Yield命令生成一个生成器,set(iterator)期望一个不可变的迭代器
这样就可以了
shingles1 = set(get_shingle(2,list1[0]))
set(tuple(x) for x in shingles1)