如何制作2克带状疱疹?

时间:2016-10-17 08:01:13

标签: python

我有这个代码,我从一些教程中得到了:

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'

如果设置了list1,则不会出现错误。但是我无法将list1转换为set 它会删除重复的单词而且我还需要它作为我的主要代码的列表,它以列表的形式处理一个巨大的文本文件。 为什么我会收到这个不可用的列表&#39;?我们不能将列表作为参数传递吗?

3 个答案:

答案 0 :(得分:1)

因为yield命令返回一个生成器。将生成器转换为集合会触发不可变类型错误。

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

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

这会为您提供list1[0]中的所有重要信息并将其放入lst

答案 1 :(得分: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')}

答案 2 :(得分:1)

Yield命令生成一个生成器,而set(iterator)需要一个不可变的迭代器

这样的事情会起作用

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