語法stats[year=2001, idx=3]
無效Python和沒有辦法你可以把它與方括號和「關鍵字參數」工作;您需要調用函數或方法才能接受關鍵字參數。
所以,說我們使它成爲一個功能,被稱爲像wells(stats, year=2001, idx=3)
。我認爲idx參數是強制性的(這個調用非常奇特,但是你沒有指出什麼可能意味着省略idx),並且只有一年,playerid和teamid必須在那裏。
根據您當前的數據結構,井已經可以實現:
def wells(stats, year=None, playerid=None, teamid=None, idx=None):
if idx is None: raise ValueError('idx must be specified')
specifiers = [(i, x) for x in enumerate((year, playerid, teamid)) if x is not None]
if len(specifiers) != 2:
raise ValueError('Exactly one of year, playerid, teamid, must be given')
ikey, keyv = specifiers[0]
return sum(v[idx] for k, v in stats.iteritems() if k[ikey]==keyv)
當然
,這是在stats
大小O(N) - 它必須檢查它的每一個條目。請以此簡單實施作爲基準來衡量正確性和性能。另一種解決方案(使用速度更快,但需要大量時間準備)是在stats
的一側放入三個清單(每年一個,playerid,teamid),每個條目表示(或複製,但我認爲表示通過全鍵可能就足夠了)與ikey/keyv對相匹配的所有統計條目。但目前還不清楚這個實現是否可能爲時過早,所以請先嚐試一下頭腦簡單的想法!)
我這個喜歡了不少,但是不是內存密集?我想你只能存儲三個引用而不是三個值的副本,但仍然... – Wells 2009-11-09 20:12:16
這是標準的星型模式設計。你可以在SQL中實現它,或者擱置或者純粹的內存。它只需要比單純的事實清單更多的存儲空間。具體來說,它需要額外的字典 - 這只是對原始事實集合中的對象的引用。 – 2009-11-09 20:57:01