Python Collections.DefaultDict Sort + Output Top X Пользовательский класс Объект - PullRequest
0 голосов
/ 20 апреля 2009

Проблема: мне нужно вывести участников 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.

Есть ли лучший способ?

*** Извините, я должен был добавить, что Count (*) недоступен из-за использования Google App Engine

[РЕДАКТИРОВАТЬ 2]

В итоге, учитывая список сообщений, как их упорядочить по количеству сообщений пользователя.

В SQL это будет:

ВЫБРАТЬ * ИЗ TweetModel ГРУППА ПО ПОЛЬЗОВАТЕЛЯМ ПОРЯДОК ПО СЧЕТУ (*)

Но я не могу сделать это в SQL и мне нужно дублировать эту функциональность в коде. Моя отправная точка "SELECT * FROM TweetModel"

Ответы [ 3 ]

1 голос
/ 20 апреля 2009

Используйте heapq.nlargest () вместо sorted () для эффективности; это то, для чего это. Я не знаю ответа о части вашего вопроса о БД.

0 голосов
/ 20 апреля 2009

Почему бы не инвертировать словарь, после того как вы его построили, чтобы ключи были счетчиками сообщений, а значения - пользователями? Затем вы можете отсортировать ключи и легко добраться до пользователей.

0 голосов
/ 20 апреля 2009

Я думаю, что ваша работа будет намного проще, если вы измените SQL-запрос на что-то вроде:

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

Я бы не стал беспокоиться о классе TweetModel, если вам нужны только данные для решения указанной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...