2014-04-26 60 views
2

我無法將數組[3,5]添加到字典linedict = {}。我已經檢查與Python: TypeError: unhashable type: 'list' 提到的解決方案,但仍錯誤來了(類型錯誤:unhashable類型:「列表」)將數組添加到字典中TypeError:不可用類型:'list'

links = [links[i:i+2] for i in range(0, len(links), 2)] 

    for i in range(0, len(links), 1): 
     print links[i] 

     if links[i] not in linedict:#on this linme 
      linedict[links[i]].append(prob) 

我想創建[3,5]值0.03的字典。

+4

'links [i]'是一個_list_。 – devnull

+0

對不起,我編輯忘記提及 – shanky

+1

這是一個''列表''。你不能散列一個''list'',因爲它們是可變的(因此它們的散列可能會在字典的控制之外改變)。你將不得不將它轉換成一個''tuple'' – aruisdante

回答

5

您已經打印links[i],所以應該注意到links列表中的每個元素也是一個列表。

字典不能包含列表作爲關鍵字,因爲字典基於哈希表並且列表不能被哈希。元組可以被散列,但它們與列表非常相似,因此您可以嘗試將列表轉換爲元組。

此外,你不能附加到不存在的東西。最直接的方法是分別處理這兩種情況,假設您想要捕獲每個匹配並將其添加到列表中。您也可以使用defaultdict,這將自動處理首次添加,如評論中所建議的那樣。

if tuple(links[i]) not in linedict: 
    linedict[tuple(links[i])] = [prob] 
else: 
    linedict[tuple(links[i])].append(prob) 
+0

我試着用上面的解決方案,但是錯誤仍然會出現,因爲關鍵錯誤 – shanky

+0

您可以通過在for循環開始時對元組進行強制轉換而不是兩次執行(和數組訪問),使其稍微更有效。 – aruisdante

+0

另外,如果'lindict''沒有包含關鍵字列表,試圖對其執行''append''會導致關鍵錯誤。你必須讓''linedict''成爲'defaultdict(列表)'' – aruisdante

1

下面是使用集合中的defaultdict的一種更簡單的方法。我還對代碼做了一些更改,使其更清晰。

import collections 

# use a default dict 
linedict = collections.defaultdict(list) 
# create your list of lists as before but convert them to tuples 
links = [tuple(links[i:i+2]) for i in range(0, len(links), 2)] 

# iterate over the lists directly 
for link in links: 
    print link 
    linedict[link].append(prob) # it's a default dict so you can append directly! 
相關問題