2012-02-07 96 views
2

我是新來的python和試驗一點,但有麻煩列表成一個元組作爲一個字典的關鍵。下面是一個例子,它應該更清楚:如何在字典中的元組中分配一個列表?

dict_of_lists_values = {} 
dict_of_lists_values[('dog', 'cat')] = 10 
dict_of_lists_values[('dog1', 'cat1')] = 10 
dict_of_lists_values[('dog1', 'cat2')] = 10 
dict_of_lists_values 
{('dog', 'cat'): 10, ('dog1', 'cat2'): 10, ('dog1', 'cat1'): 10} 

這完美的作品,並讓我有一兩個值,我可以在一個字典鍵使用。當我嘗試將其應用到一個列表,我得到一個錯誤:TypeError: unhashable type: 'list'

dict_of_lists_values = {} 
a = [22, 39, 0] 
b = [15, 38, 12] 
dict[(a, b)] = 'please work' 

根據我以前的實驗,我想如果我轉換列表轉換爲字符串時,它會工作,但我想它,因爲它是一個列出不是一個字符串。

這可能嗎?

+0

另外,對不起,如果標題是令人困惑的..我試圖想到不那麼令人困惑的標題(事實上,我只是想出了這個顯示這個問題有多混亂:-) – Lostsoul 2012-02-07 21:56:35

+2

這失敗了,因爲哈希元組由每個元素的散列組成。 – 2012-02-07 22:01:42

+0

我以爲它像我的第一個例子那樣轉換它。我要檢查我的書上的Python元組...感謝澄清.. – Lostsoul 2012-02-07 22:05:20

回答

4

在列表上調用tuple()以創建具有列表中元素的元組。

1

Python中的字典只能有不可變/可哈希鍵。

字符串,數字和元組是不可變的,所以它們可以用作字典鍵。實例有一個獨特的__hash__(),所以它們也可以使用。但是列表是可變的,所以它們不能用作鍵。

+1

男人,我很困。後退了。感謝編輯羅素。 – 2012-02-07 21:59:25

3

不可以。使用list類型的字典密鑰是不可能的。但是,您可以擴展list,使其可哈希,然後使用該新類型。 (雖然有點麻煩)

class hlist(list): 
    def __hash__(self): 
     # Hash it somehow; here, I convert it to a hashable tuple ... and then hash it 
     return hash(tuple(self)) 

l1 = hlist([1,2,3]) 
l2 = hlist([4,5,6]) 

d = { 
    l1:"Hi.", 
    l2:"Hello!" 
} 

請注意Sven的評論如下。可變密鑰是危險的,因爲如果它們被修改,它們的哈希將變爲陳舊。

+1

這是一個非常糟糕的想法,因爲在列表更改時哈希會更改。如果您使用可變字典鍵,請確保散列不會改變。 – 2012-02-07 22:07:40

+0

@SvenMarnach爲什麼我們不希望哈希改變,如果列表更改?這個問題似乎尋求一種基於內容的密鑰,而不是基於身份的密鑰。或者我誤解了你? – cheeken 2012-02-07 22:17:30

+3

下面是一個[示例](http://ideone.com/1UEdb)來說明問題。如果散列發生變化,字典對象將不再能夠找到該鍵,因爲它在散列表內的位置是使用原始散列確定的。 – 2012-02-07 22:18:00

相關問題