2012-06-06 38 views
1

伙计们,我们有以下的问题:我们已经得到了包含表数据的几个对象,看起来是这样的:运行时,我们需要在Python的方式来操纵数据集

{'field1':'value1','field2':'value2', ...}

在某些时候“选择“从这些对象(表),以同样的方式一个数据来查询数据库(在这组匹配字段1 == SOME_VALUE和场2 == some_other_value即得到记录)。我们无权访问原始的RDBMS或db视图。我们摆弄使用中间DB(如sqlite的),然后根据需要查询它的数据的想法。

,但感觉“臭”移动到另一个部件添加到应用程序只是为数据集查询的目的。所以,我的问题是:是否有一种pythonic方式来解决这个问题?我们是否应该咬紧牙关并将数据推送到数据库,查询数据库,然后删除?预先感谢您的意见和建议。

的数据字典的列表。

回答

2
def one_of(alternatives): 
    return lambda val: val in alternatives 

def within(frm, to): 
    return lambda val: frm <= val <= to 

def gte(const): 
    return lambda val: val >= const 

def lte(const): 
    return lambda val: val <= const 

def exact(const): 
    return lambda val: val == const 


def select(data, **kwargs): 
    for item in data: 
     if all(chk(item[key]) for key, chk in kwargs.items()): 
      yield item 

data = [ 
    {'id': 1, 'name': 'Ann', 'age': 25}, 
    {'id': 2, 'name': 'Tom', 'age': 10}, 
    {'id': 3, 'name': 'John', 'age': 40}, 
    {'id': 4, 'name': 'Tom', 'age': 18}, 
] 

for person in select(data, age=gte(15), id=within(3, 4), name=exact('Tom')): 
    print person['name'] 
+0

有趣。那里有好主意。 – rdodev

1

如果你只需要类型some_field == some_value几个简单的查询,也没有必要的数据库。假设你的数据字典的列表,你可以使用过滤列表理解数据:

[x for x in data if x["field1"] == some_value] 
+0

是我们的数据字典的列表。而你的建议可能适用于我们的一些案例。但是,我认为在同时处理两个以上的字典并合并结果时是行不通的。 – rdodev

1

假设你的数据对象是在列表中,你可以使用filter()。举个简单的例子:

filter(lambda x: x["fld1"] == "val1" and x["fld2"] == "val2", listOfObjects) 

这将返回只包含那些满足于lambda函数指定的条件的对象列表。对于更复杂的查询,你可以创建你自己的函数(只要它返回一个布尔值)。