問題:投稿されたメッセージの量によって決定されるTOP Xコントリビュータを出力する必要があります。Python Collections.DefaultDict Sort + Output Top Xカスタムクラスオブジェクト
データ:投稿されたメッセージのコレクションがあります。これは、以下のサンプルクエリによるDatabase/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)
しかし、唯一の方法はありません元のオブジェクトを取得するwは、オブジェクトcをループし、KeyNameを見つけてからTweetModelオブジェクトを取得するためにTweetsSQLを探します。
良い方法がありますか?
***私はCOUNT(*)が原因のGoogleのApp Engineを使用して利用できないことを追加している必要があります
申し訳ありませんが、私はどのように行う[EDIT 2]要約すると
、メッセージのリストを与えられ、ユーザーのメッセージカウントでそれらを注文してください。
SQLでは、それは次のようになります。COUNT(*)
BY
SELECT * TweetModelグループからユーザーBY ORDERしかし、私はSQLでそれを行うと、コード内でこの機能を複製する必要はできません。
SELECT top 100 userId FROM TweetModel GROUP BY userId ORDER BY count(*)
場合、私はTweetModelクラスを気にしないだろう:私の出発点は、私はあなたの仕事はあなたのような何かにSQLクエリを変更する場合は非常に簡単になると思います
申し訳ありませんが、Googleのアプリエンジンを使用しているため、カウント(*)が利用できない – TimLeung