2016-10-17 17 views
2

我有这样的代码,我从一些教程 - 有:如何创建2克带状疱疹?

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:\Research\Shingle Method\create_shingle.py", line 10, in <module> 
    shingles1 = set(get_shingle(2,list1[0])) 
TypeError: unhashable type: 'list' 

如果设置列表1,则错误呢不来。但我不能将list1转换为设置为它删除重复的单词并且我还需要它是我的主要代码的列表,它以列表的形式处理一个巨大的文本文件。 为什么我得到这个'不可干扰列表'?我们不能将列表作为参数吗?

回答

1

问题在于这样一个事实,你的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')} 
+0

谢谢你解释得这么好:)它的工作 –

+0

很高兴听到这个消息。 ;) – DJanssens

1

因为yield命令返回一个生成器。发生器到一个集合的转换触发了不可能的类型错误。

您可以通过简单的修改使您的代码正常工作。

shingles1 = get_shingle(2,list1[0]) 
lst = [x for x in shingles1] 

这会给你所有的双字母组从list1[0],放入lst

+0

这也工作:d谢谢:) –

1

收率命令生成一个发电机和组(迭代器)期望迭代器是不可变的

因此,像这样将工作

shingles1 = set(get_shingle(2,list1[0])) 
set(tuple(x) for x in shingles1) 
+0

谢谢你的工作:D –