首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >,Datastore对象问题

,Datastore对象问题
EN

Stack Overflow用户
提问于 2014-07-15 17:21:53
回答 1查看 58关注 0票数 0

所以我不知道为什么,但我的程序似乎无法分辨r是否在结果中

我想知道这是否与对象有关

代码语言:javascript
复制
terms = query.split()
res = db.GqlQuery("SELECT * FROM Assignment ORDER BY created DESC")
results = []
for term in terms:
    term.strip()
    for r in res:
        #WHY THE CRAP DOESNT THIS WORK....
        #if r is in results... it still appends r to results
        if term in r.name and r not in results:
            results.append(r)
        if r.tags:
            if term in r.tags and r not in results:
                results.append(r)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 04:02:48

线

代码语言:javascript
复制
for r in res:

在循环内

代码语言:javascript
复制
for term in terms:

res是一个查询。所以当你打电话

代码语言:javascript
复制
for r in res:

它真的在召唤

代码语言:javascript
复制
for r in res.run():

因此,代码正在执行查询,每次通过外部循环获得一组新的结果。因此,这些新的结果对象与您可能在外部循环的前一次迭代中保存的结果对象不匹配。

您可以将"results = []“改为字典,并将实体的键用作字典中的键,然后进行比较检查。但是,在外部循环中多次执行此查询是非常低效的。

看起来,代码的目标是找出哪些赋值实体在Assignment.name或Assignment.tags属性中包含搜索项。如果是这样的话,那么我建议交换一些东西,然后做如下的事情:

代码语言:javascript
复制
terms = query.split()
assignments = db.GqlQuery("SELECT * FROM Assignment ORDER BY created DESC")
assignmentsWithTerms = []

for assignment in assignments:
    for term in terms:
        if term in assignment.name or (assignment.tags and term in assignment.tags):
            assignmentsWithTerms.append(assignment)
            continue

这种方法只执行一次GqlQuery,因此它将更快、更便宜。此外,当您循环查看结果时,一旦找到第一个项,它就会将赋值添加到列表中,然后继续,再次使其更快。

我希望这能帮到你!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24764395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档