2009-04-20 3 views
0

問題:投稿されたメッセージの量によって決定される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クエリを変更する場合は非常に簡単になると思います

答えて

1

効率を上げるため、sorted()の代わりにheapq.nlargest()を使用します。それが何のためだ。私はあなたの質問のDB部分についての答えを知らない。

0

「をTweetModel SELECT * FROM」です上記の問題を解決するために必要なのはデータだけです。

+0

申し訳ありませんが、Googleのアプリエンジンを使用しているため、カウント(*)が利用できない – TimLeung

0

辞書を逆にして、それを構成したら、キーがメッセージカウントで、値がユーザーになるようにするのはなぜですか?その後、キーをソートして簡単にユーザーにアクセスできます。