想象一下,您在Google App Engine数据存储区中有一个实体,为匿名用户存储链接。 您希望执行以下不支持的SQL查询:
SELECT DISTINCT user_hash FROM links
相反,您可以使用:
user = db.GqlQuery("SELECT user_hash FROM links")
如何使用Python 最有效来过滤结果,以便返回DISTINCT结果集? 如何计算DISTINCT结果集?
答案 0 :(得分:5)
答案 1 :(得分: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': ''}
答案 2 :(得分: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 :(得分: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()
如果有人有更好的解决方案,请分享。