在python中使用直接查找行和列来形成内存表的正确方法是什么.
我想过以这种方式使用dicts的dict,
class Table(dict):
def __getitem__(self, key):
if key not in self:
self[key]={}
return dict.__getitem__(self, key)
table = Table()
table['row1']['column1'] = 'value11'
table['row1']['column2'] = 'value12'
table['row2']['column1'] = 'value21'
table['row2']['column2'] = 'value22'
>>>table
{'row1':{'column1':'value11','column2':'value12'},'row2':{'column1':'value21','column2':'value22'}}
Run Code Online (Sandbox Code Playgroud)
我很难在列中查找值.
>>>'row1' in table
True
>>>'value11' in table['row1'].values()
True
Run Code Online (Sandbox Code Playgroud)
现在我怎么也查找如果'column1'有'value11'
错形成表格的方式?
是否有更好的方法来实现这些表更容易查找?
现在,如果'column1'具有'value11',我该如何查找
any(arow['column1'] == 'value11' for arow in table.iteritems())
这种形成表的方法是错误的吗?
不,它只是非常"暴露",也许太多了 - 它可以有效地封装在一个暴露你需要的方法的类中,然后最好地实现它们的问题不会影响你的所有其他应用程序.
有没有更好的方法来实现这样的表,更容易查找?
一旦你设计一个类,其界面你会喜欢使用,你可以在一个工作负载代表的非常不同的实现方法和基准他们尝试你的使用模式,这样你就可以找出最适合你(假设表操作和查找是应用程序运行时的重要组成部分 - 当然 - 查找,分析您的应用程序).
我在工作中维护的大型内部应用程序中有类似但不完全相同的需求,除了行索引是整数(只有列名称是字符串),列顺序很重要,工作负载更多是关于"编辑"表(添加,删除,重新排序行或列,重命名列等).我开始使用一个表,公开我需要的功能,内部最简单的粗略实现(一个dicts列表,以及列排序的列名列表); 到目前为止,我已经将它(独立于实际的"应用程序级"部分,但基于其分析和基准测试)演变为完全不同的实现(目前基于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())
Run Code Online (Sandbox Code Playgroud)
等等 - 用有用的短名称编写你的应用程序所需的所有方法,然后可能看看你是否可以将它们中的一些作为特殊方法的别名,如果它们经常以这种方式使用,例如也许(假设Python 2.* - - 在3.*)中需要稍微不同的语法:
def __setitem__(self, (row, col), val):
self.add(row, col, val)
Run Code Online (Sandbox Code Playgroud)
等等.一旦您的代码正常工作,就可以在适当的时候进行分析,基准测试,以及 - 或许 - 实现的内部优化.