【问题标题】:Python: DISTINCT on GQuery result set (GQL, GAE)Python:GQuery 结果集上的 DISTINCT(GQL、GAE)
【发布时间】:2010-09-19 08:23:44
【问题描述】:

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

SELECT DISTINCT user_hash FROM links

你可以使用:

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

如何使用Python最高效地过滤结果,从而返回一个DISTINCT结果集? 如何统计 DISTINCT 结果集?

【问题讨论】:

    标签: python sql google-app-engine distinct gql


    【解决方案1】:

    恢复这个问题以完成:

    release 1.7.4 中引入了 DISTINCT 关键字。

    您可以找到更新后的 GQL 参考(例如 Python)here

    【讨论】:

      【解决方案2】:

      一套是解决这个问题的好方法:

      >>> 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.4 版中的新功能。 python.org/doc/2.5.2/lib/types-set.html
      • 记录数比较少的情况下设置是可以的。但是,如果您在数据存储中拥有数以百万计的记录,那将是非常低效的!更好的策略是在插入/更新时预先计算并存储结果。
      【解决方案3】:

      一种选择是将结果放入一个集合对象中:

      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 循环也可以压缩为列表解析。

      【讨论】:

        【解决方案4】:

        很抱歉提出这个问题,但在 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()
        

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

        【讨论】:

        • 还有另一个问题询问如何在 Datastore 中执行此操作,基本答案是您不能:stackoverflow.com/questions/1183102/…。我试图就如何去规范化提出一些模糊的想法,但从那时起,最先进的技术可能已经发展了。
        猜你喜欢
        • 2019-06-18
        • 2011-06-07
        • 1970-01-01
        • 2013-03-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        相关资源
        最近更新 更多