我想要的是能夠處理具有固定鍵集的數據集。所有的鍵都是字符串。數據將永遠不會被編輯。我知道這與正常類型的字典來完成,像這樣:存儲固定密鑰的最佳方式:通過python中的密鑰訪問的值數據集?
data_a = {'key1': 'data1a', 'key2': 'data2a', 'key3': 'data3a'}
data_b = {'key1': 'data1b', 'key2': 'data2b', 'key3': 'data3b'}
data_c = {'key1': 'data1c', 'key2': 'data2c', 'key3': 'data3c'}
他們必須能夠被稱爲像這樣:
data_a['key1'] # Returns 'data1a'
然而,這看起來是浪費內存(因爲字典明顯保持自己三分之一空或類似的東西,同時也存儲密鑰多次),也很繁瑣的創建,因爲我需要不斷地在我的代碼中一遍又一遍地輸入相同的密鑰。我也冒着意外改變數據集中的某些東西的風險。
我現在的解決方案是首先將一組鍵存儲在一個元組中,然後將數據作爲元組存儲起來。它看起來像這樣:
keys = ('key1', 'key2', 'key3')
data_a = ('data1a', 'data2a', 'data3a')
data_b = ('data1b', 'data2b', 'data3b')
data_c = ('data1b', 'data2c', 'data3c')
檢索數據,我這樣做:
data_a[keys.index('key1')] # Returns 'data1a'
然後,我瞭解到這似乎是能夠做什麼,我需要這個東西叫做namedtuples:
import collections
Data = collections.namedtuple('Data', ('key1', 'key2', 'key3'))
data_a = Data('data1a', 'data2a', 'data3a')
data_b = Data('data1b', 'data2b', 'data3b')
data_c = Data('data1b', 'data2c', 'data3c')
但是,看起來我不能簡單地通過鍵調用值。相反,以獲取由關鍵數據,我必須使用GETATTR,這似乎不是很直觀:
getattr(data_a,'key1') # Returns 'data1a'
我的標準是記憶效率,然後再執行效率。在這三種方法中,哪種方法可以做到最好?或者我錯過了一些東西,還有更多的pythonic成語來得到我想要的東西?
編輯:我現在最近也瞭解到__slots__
的存在,它顯然運行更高效的鍵:值對,而非常消耗相同(?)的內存量。與this類似的實現是否可以替代namedtuples?
一個正交的建議,你看過[pandas](http://pandas.pydata.org/)嗎? – tacaswell
會不會有一些像memcache那樣的k/v存儲會更好? –