7

想象一下,您在 Google App Engine 数据存储区中有一个实体,为匿名用户存储链接。您想要执行以下不受支持的 SQL 查询:

SELECT DISTINCT user_hash FROM links

相反,您可以使用:

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

如何最有效地使用 Python过滤结果,使其返回 DISTINCT 结果集?如何计算 DISTINCT 结果集?

4

4 回答 4

5

恢复这个问题以完成:

DISTINCT 关键字已在1.7.4 版本中引入。

您可以在此处找到更新的 GQL 参考(例如 Python)。

于 2013-01-05T07:38:24.033 回答
3

一套是处理这个问题的好方法:

>>> 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': ''}
于 2008-10-27T08:25:57.947 回答
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循环也可以压缩为列表理解。

于 2008-10-27T08:01:47.747 回答
0

很抱歉提出这个问题,但在 GAE 中我无法比较这样的对象,我必须使用 .key() 进行这样的比较:

当心,这是非常低效的:

def unique_result(array):
    urk={} #unique results with key
    for c in array:
        if c.key() not in urwk:
            urk[str(c.key())]=c
    return urk.values()

如果有人有更好的解决方案,请分享。

于 2011-03-17T15:04:24.720 回答