Python数据集操作方法

时间:2012-06-06 17:58:58

标签: python

伙计们,我们遇到以下问题:我们有几个包含表格数据的对象,如下所示:

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

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

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

数据是字典列表。

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

如果您只需要一些some_field == some_value类型的简单查询,则不需要数据库。假设您的数据是字典列表,您可以使用列表解析来过滤数据:

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

答案 2 :(得分:1)

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

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

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