[英]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.