簡體   English   中英

Python Collections.DefaultDict排序+輸出前X個自定義類對象

[英]Python Collections.DefaultDict Sort + Output Top X Custom Class Object

問題:我需要輸出由發布的郵件數量決定的TOP X貢獻者。

數據:我收集了張貼的消息。 通過下面的示例查詢,這不是數據庫/ SQL問題,僅提供代碼概述。

tweetsSQL = db.GqlQuery("SELECT * FROM TweetModel ORDER BY date_created DESC")

我的模特:

class TweetModel(db.Model):
# Model Definition
# Tweet Message ID is the Key Name
to_user_id = db.IntegerProperty()
to_user = db.StringProperty(multiline=False)
message = db.StringProperty(multiline=False)
date_created = db.DateTimeProperty(auto_now_add=False)
user = db.ReferenceProperty(UserModel, collection_name = 'tweets')

從SO上的示例中,我可以通過執行以下操作找到TOP X貢獻者:

    visits = defaultdict(int)
    for t in tweetsSQL:
        visits[t.user.from_user] += 1

現在,我可以使用以下方法對其進行排序:

c = sorted(visits.iteritems(), key=operator.itemgetter(1), reverse=True)

但是現在檢索原始對象的唯一方法是遍歷對象c,找到KeyName,然后在TweetsSQL中查找它以獲得TweetModel對象。

有沒有更好的辦法?

***對不起,我應該補充說,由於使用了Google App Engine,Count(*)不可用

[編輯2]

總結中,給定消息列表,如何根據用戶的消息計數對其進行排序。

在SQL中,它將是:

SELECT * FROM TweetModel GROUP BY用戶ORDER BY Count(*)

但是我無法在SQL中做到這一點,需要在代碼中復制此功能。 我的出發點是“ SELECT * FROM TweetModel”

為了提高效率,請使用heapq.nlargest()而不是sorted()。 這就是它的目的。 我不知道您問題的數據庫部分的答案。

我認為,如果將SQL查詢更改為以下內容,您的工作會容易得多:

SELECT top 100 userId FROM TweetModel GROUP BY userId ORDER BY count(*)

如果您只需要數據來解決所陳述的問題,我就不會理會TweetModel類。

一旦構造了字典,為什么不反轉字典,以使鍵是消息計數,值是用戶? 然后,您可以對鍵進行排序並輕松找到用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM