Python:GQuery结果集上使用DISTINCT(GQL,GAE)
想象一下,你在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
循环也可以简化成一个列表推导式。
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': ''}