2016-10-17 46 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 –