1

不确定这是否可能,但我使用的是 sqlalchemy,我的查询将所有项目作为对象返回。我想在该对象列表中搜索项目,但不必每次都进行 for 循环。

以下是我现在知道如何做到这一点:

for x in objects_from_query:
    print x.name, ' - ', x.age

如果我想知道我的列表中是否有名为“bob”的用户的数据,我必须:

for x in objects_from_query:
    if x.name == 'bob':
        print 'bob exists!'

因为我必须经常这样做,所以我想知道是否有更快的方法来查找 bob 是否存在而不必每次都进行 for 循环?通常对于列表,我会执行类似 objects_from_query.index("bob") 的操作,但是当它不是普通列表而是对象列表时,是否有类似的东西?

4

5 回答 5

4

如果您使用的是 sqlalchemy,则可以使用Query.filter对象上的方法,该方法将转换为 SQL 作为 where 子句。像下面这样的东西会起作用: -

    import sqlalchemy as sql

    session = sql.orm.sessionmaker( bind=sql.create_engine( 'sqlite:///sql.db' ) )
    Bob = session.query( Names ).filter( Names.name == "bob" )
于 2012-07-21T21:40:34.377 回答
3

答案:没有。无论您使用什么数据结构,您都需要一个循环,来自 van Emde Boas、数组、堆等。

这就是你应该学习编程的原因:为了能够找到一种数据结构,使得 for 循环尽可能快地找到你需要的东西。

于 2012-07-21T21:34:20.307 回答
3

过滤器如何获取所有名称为 bob 的对象,例如:

filter(lambda x: x.name == 'bob', objects_from_query)

这仍然可能在下面运行一个循环,但是如果您正在寻找一种更简洁的编写方式,这很好。

于 2012-07-21T21:39:46.013 回答
3

我不能真正谈论第一个,但对于第二个,这样的事情真的可以加快方法

print(x.name == 'bob' in objects_from_query)
于 2012-07-21T21:40:02.540 回答
2
>>> class thing():
...   name = ""
...   age = 0
...
>>> [x.age for x in l if x.name == "bob"]
[1]

列表理解。

于 2012-07-21T21:45:11.417 回答