Python:GQuery结果集上使用DISTINCT(GQL,GAE)

7 投票
4 回答
4914 浏览
提问于 2025-04-11 09:33

想象一下,你在Google App Engine的数据库里有一个存储匿名用户链接的实体。你想执行一个SQL查询,但这个查询是数据库不支持的。

SELECT DISTINCT user_hash FROM links

不过,你可以使用其他方法:

user = db.GqlQuery("SELECT user_hash FROM links")

那么,如何用Python最有效地过滤结果,以便返回不重复的结果集呢?还有,怎么计算这个不重复的结果集的数量呢?

4 个回答

1

一种选择是把结果放到一个集合对象里:

http://www.python.org/doc/2.6/library/sets.html#sets.Set

这个集合只会包含你放进去的不同的值。

如果不行的话,可以创建一个新的列表,只包含独特的对象。可以像这样:

unique_results = []
for obj in user:
    if obj not in unique_results:
        unique_results.append(obj)

那个 for 循环也可以简化成一个列表推导式。

5

为了完整性,我来重新提一下这个问题:

DISTINCT这个关键词是在1.7.4版本中引入的。

你可以在这里找到更新后的GQL参考资料(比如Python的部分)。

3

使用集合(set)是处理这个问题的好方法:

>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>> 

关于第一个答案,有一个建议是,集合和字典在快速获取唯一结果方面表现更好。因为在列表中查找某个元素的时间复杂度是O(n),而在集合和字典中则是O(1)。这意味着如果你想存储额外的数据,或者想创建提到的unique_results列表,使用集合可能会更好,像这样做:

unique_results = {}
>>> for item in a:
    unique_results[item] = ''


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}

撰写回答