Python Collections.DefaultDict 排序并输出前 X 个自定义类对象
问题:我需要输出根据发帖数量排名的前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')
根据StackOverflow上的例子,我找到了获取前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对象。
有没有更好的方法呢?
*** 对不起,我应该补充说明,由于使用了谷歌应用引擎,Count(*)不可用。
[编辑 2]
总结一下,给定一组消息,我该如何按用户的消息数量对它们进行排序。
在SQL中,这样写:
SELECT * FROM TweetModel GROUP BY Users ORDER BY Count(*)
但我不能使用SQL,需要在代码中复制这个功能。我的起点是“SELECT * FROM TweetModel”。
3 个回答
0
为什么不在构建完字典后把它反转一下呢?也就是说,把原来的键变成消息的数量,把值变成用户。这样你就可以对数量进行排序,然后很方便地找到对应的用户了。
0
我觉得如果你把SQL查询改成下面这样的,你的工作会轻松很多:
SELECT top 100 userId FROM TweetModel GROUP BY userId ORDER BY count(*)
如果你只是需要这些数据来解决你提到的问题,那就没必要去用TweetModel这个类。
1
用heapq.nlargest()来代替sorted(),这样效率更高;这就是它的用途。我不太清楚你问题中关于数据库的部分。