現在我該怎樣做,如果查找 '列1' 有 'value11'
any(arow['column1'] == 'value11' for arow in table.iteritems())
是形成表 錯誤的這種方法嗎?
不,它只是非常「暴露」,也許是太多了 - 它可以有效地在暴露你所需要的方法的類來封裝,那麼如何最好地實現這些問題不會影響所有的休息的應用程序。
有沒有更好的方法來實現 這樣的表更容易查找?
一旦你設計一個類,它的接口你最好喜歡使用,你可以在一個工作負載代表你使用模式非常不同的實現方法和比較基準實驗,這樣你就可以找到(假設表格操作和查找是你應用程序運行時的重要組成部分,當然 - 找出配置文件你的應用程序)。
我在工作中維護的大型內部應用程序中有類似但不相同的需求,除了行索引是整數(只有列名是字符串),列順序非常重要,工作負載更重要的是「編輯「表(添加,刪除,重新排序行或列,重命名列等)。我開始使用一個表格來展示我需要的功能,並在內部使用最簡單的粗略和準備的實現(列表的列表,以及列名的列名)。到目前爲止,我已經將它(獨立於實際的「應用程序級」部分,但是基於它們的分析和基準測試)發展到完全不同的實現(目前基於numpy
)。
我認爲你應該沿着類似的路線前進:使用你需要的所有方法將你當前的實現「打包」到一個漂亮的「接口」中,除非這個表對象是一個性能瓶頸,否則就完成了;如果它是是的瓶頸,您可以優化實施(實驗,測量,重複;-),而不會干擾您的其他應用程序。
繼承dict
不是一個好主意,因爲你可能不想公開所有dict
的豐富功能;此外,你所做的大致是collections.defaultdict(dict)
的低效執行。所以,封裝後者:
import collections
class Table(object):
def __init__(self):
self.d = collections.defaultdict(dict)
def add(self, row, col, val):
self.d[row][col] = val
def get(self, row, col, default=None):
return self.d[row].get(col, default)
def inrow(self, row, col):
return col in self.d[row]
def incol(self, col, val):
return any(x[col]==val for x in self.d.iteritems())
等等,等等 - 寫所有的方法你的應用需求,提供有用的,短的名字,那麼也許看看他們是否」你可以別名它們中的一些特殊方法再經常使用這種方式,例如,也許(假設Python的2 * - 需要3稍微不同的語法*):
def __setitem__(self, (row, col), val):
self.add(row, col, val)
等等。一旦你的代碼工作,然後來分析,基準測試和 - 也許 - 內部優化實施的時機正確。
它是一個'稀疏表',還是每個單元格都包含一個值?另外,每個值都是唯一的嗎?你想快速查看基於座標的值,或者其他方式,或兩者兼而有之? – 2010-04-02 07:10:10
每個單元格都會包含一個值。價值觀不一定是唯一的。我需要兩種方式來查找值。這是可以實現的嗎? – asdfg 2010-04-02 07:22:48
當你尋找一個價值時你想要什麼結果?它出現的所有座標? – 2010-04-02 07:27:06