想象一下,您在 Google App Engine 数据存储区中有一个实体,为匿名用户存储链接。您想要执行以下不受支持的 SQL 查询:
SELECT DISTINCT user_hash FROM links
相反,您可以使用:
user = db.GqlQuery("SELECT user_hash FROM links")
如何最有效地使用 Python过滤结果,使其返回 DISTINCT 结果集?如何计算 DISTINCT 结果集?
想象一下,您在 Google App Engine 数据存储区中有一个实体,为匿名用户存储链接。您想要执行以下不受支持的 SQL 查询:
SELECT DISTINCT user_hash FROM links
相反,您可以使用:
user = db.GqlQuery("SELECT user_hash FROM links")
如何最有效地使用 Python过滤结果,使其返回 DISTINCT 结果集?如何计算 DISTINCT 结果集?
一套是处理这个问题的好方法:
>>> 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': ''}
一种选择是将结果放入一个集合对象中:
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
循环也可以压缩为列表理解。
很抱歉提出这个问题,但在 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()
如果有人有更好的解决方案,请分享。