2012-11-14 25 views
4

Python中如何創建一個字典,其中的鍵是整數對?字典中的鍵是Python中的整數對

例如,如果我這樣做:

mydict=dict() 
mydict[ [1,2] ] = 'xxx' 

我得到TypeError: unhashable type: 'list'

於是我想出了兩種不同的解決方案錯誤:字符串或元組作爲密鑰。

第一種解決方案,似乎在對整數轉換成其字符串表示:

mydict=dict() 
mydict[ str(1)+" "+str(2) ] = 'xxx' 

而第二方案涉及的元組:

mydict=dict() 
mydict[ tuple([1,2]) ] = 'xxx' 

從一些實驗,我發現,元組解決方案比字符串慢。 有沒有更簡單,快捷的方式來使用兩個整數作爲鍵?

+0

提示:閱讀[PEP-8](http://www.python.org/dev/peps/pep-0008)。它使你的代碼更具可讀性。 –

+3

我覺得你的時機很糟糕。我對它進行了計時,發現直接構建一個元組('mydict [(x,y)]')是最快的。如果先構造一個列表,然後將其轉換爲一個元組(這是不必要的),那麼它需要大約1.7倍的時間('mydict [tuple([x,y])]')。字符串方法最慢,慢2.6倍。如果元組已經存在,你可以使它更快,'mydict [some_tuple]'比'mydict [(x,y)]'快0.7倍。 –

+0

@lazyr僅僅是爲了插入還是爲了訪問? –

回答

8

你應該使用一個元組,可散列:

mydict = {} 
mydict[(1, 2)] = 'xxx' 
# or more concisely (@JamesHenstridge): 
mydict[1,2] = 'xxx' 

如果確實太慢(非必要,請勿優化),然後給出了一個整數的最大值,構建指數:

def index(a, b, maxB): 
    return a*maxB + b 

mydict[index(1, 2, max)] = 'xxx' 

但要知道,一個函數調用很容易進一步下降慢,這樣你就可以在內嵌可讀性成本的功能,並使其更容易引入錯誤,如果在其他地方複製粘貼:

mydict[1*max + 2] = 'xxx' 

順便提及,有一個SO問題上速度字典與元組的鍵:

Python tuples as keys slow?

做分析的一點點表明內聯指數爲輕微(< 5%)比元組快,並且速度比索引快兩倍。如果這是在PyPy中完成的,我希望索引版本(內聯或不內聯)更快。

在附註中;如果你擔心字典中的插入速度,你可能會使用錯誤的數據結構,或者做更多的工作而不是必要的。作爲一個例子,如果你可以讓行解析爲惰性,並且只解析你實際從中拉出數據的行,那麼解析一個CSV文件到每一行中的字段並將這些值存儲在一個字典中可能是不必要的。即當你可以做dataLines = somecsv.readlines(); print getField(dataLines[7], 'date')時,不要做data = parseAll(somecsv); print data[7,'date']

+0

@ tim-pietzcker:乾杯,我對字典任務一無所知。 –

+3

兩個改進:(1)'mydict [1,2]'相當於'mydict [(1,2)]'並且看起來好一點。 (2)'index'函數調用可能比構造元組更容易,所以你可能想要內聯算術。 –

+0

@JamesHenstridge:1:有效的觀點,儘管我試圖找出將它作爲一個隱含的元組而不是明確的元組是否更具有啓發性 - 我懷疑明確地看到你可以有'tup =( 1,2); mydict',雖然也許我應該指出。 2:如果索引要在當前範圍之外重用,以避免容易造成但令人沮喪的錯誤,我通常更希望將索引函數明確定義。但它仍然是一個重要的點,所以我會更新。 –