1

伙计们,我们有以下问题:我们有几个包含表格数据的对象,看起来像这样:

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

在运行时的某个时刻,我们需要从这些对象(表)中“选择”数据,就像查询数据库一样(即获取该集合中匹配 field1 == some_value 和 field2==some_other_value 的记录)。我们无权访问原始 RDBMS 或 db 视图。我们摆弄了使用中间数据库(如 sqlite)然后根据需要查询数据的想法。

但是为了数据集查询的目的,在应用程序中添加另一个移动部分感觉很“臭”。所以,我的问题是:有没有一种pythonic方法来解决这个问题?我们是否应该硬着头皮将数据推送到数据库,查询数据库,然后删除?提前感谢您的意见和投入。

数据是字典列表。

4

3 回答 3

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']
于 2012-06-06T18:34:43.013 回答
1

如果您只需要几个简单的 type 查询some_field == some_value,则不需要数据库。假设您的数据是一个字典列表,您可以使用列表推导过滤数据:

[x for x in data if x["field1"] == some_value]
于 2012-06-06T18:03:43.213 回答
1

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

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

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

于 2012-06-06T18:13:57.587 回答