2011-04-06 131 views
1

的數據結構應滿足以下目的:Python數據結構設計

  • 每個對象是與某些鍵 - 值對
  • 的鍵和值不是預先確定的獨特的,並且可以包含任何的字符串值
  • 查詢的對象應該是快速

實施例:

  • object_123({'stupid':True, 'foo':'bar', ...})
  • structure.get({'stupid':True, 'foo':'bar', ...})應該返回object_123

最理想這種結構與可通過標準庫標準Python數據結構來實現。

你將如何實現這一點?

+0

@ahojnnes:作業? – phooji 2011-04-06 19:43:22

+0

@phooji:不,我想不出任何干淨和良好的實施,並尋求專家的意見。 – 2011-04-06 19:47:17

+0

@ phooji:我也想知道,但他的其他問題似乎是合法的。 – 2011-04-06 19:48:35

回答

5

我能想到的最簡單的解決方法是使用排序的元組鍵:無論是在一類或只是包裝他們

def key(d): return tuple(sorted(d.items())) 

x = {} 
x[key({'stupid':True, 'foo':'bar', ...})] = object_123 

x.get(key({'stupid':True, 'foo':'bar', ...})) => object_123 

另一種辦法是拿出自己的散列方案爲您的鑰匙(使用字典中的數字鍵),但取決於您的訪問模式,這可能會更慢。

+0

+1:創建「凍結字典」的好方法。 – 2011-04-06 19:48:34

+0

哈!你擊敗了我 – inspectorG4dget 2011-04-06 19:48:44

+0

+1,儘管我的一部分人想知道是否有一種名爲tuple的方法可能會有幫助... – ncoghlan 2011-04-07 08:20:34

0

我認爲SQLite或者是你所需要的。它可能不能用標準的python結構來實現,但它可以通過標準庫來實現。

0

object_123是一個字典,它看起來很像。你的structure似乎是一個標準的字典,如(('foo', 'bar'), ('stupid', True));換句話說,tuple(sorted(object_123.items())),以便它們始終按照定義的順序列出。

定義的順序的原因是因爲dict.items()不保證以給定的順序返回列表。如果您的字典密鑰是(('foo', 'bar'), ('stupid', True)),那麼您不希望僅因爲您正在搜索(('stupid', True),('foo', 'bar'))而產生誤報。對值進行排序可能是防止這種情況的最快方法。