Как я могу изменить и объединить список кортежей в Python? - PullRequest
1 голос
/ 15 мая 2010

Я новичок в Python, поэтому заранее извиняюсь, если мой вопрос выглядит тривиальным.

Из запроса psycopg2 у меня есть результат в виде списка кортежей, который выглядит следующим образом:

[(1, 0), (1, 0), (1, 1), (2, 1), (2, 2), (2, 2), (2, 2)]

Каждый кортеж представляет идентификатор местоположения, в котором произошло событие, и час дня, когда событие имело место.

Я бы хотел изменить и объединить этот список с промежуточными итогами для каждого часа в каждом местоположении, чтобы форма выглядела так:

[(1, 0, 2), (1, 1, 1), (1, 2, 0), (2, 0, 0), (2, 1, 1), (2, 3, 3)]

Где каждый касатель теперь скажет мне это, например: в местоположении 1 в час 0 было 2 события; в местоположении 1 в час 1 произошло 1 событие; и так далее ...

Если в определенный час было 0 событий, я все еще хотел бы увидеть его, например, 0 событий в 0 часов в местоположении 2: (2, 0, 0)

Как я могу реализовать это в Python?

РЕДАКТИРОВАТЬ: Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

Что-то вроде ...:

import collections

raw_data = [(1, 0), (1, 0), (1, 1), (2, 1), (2, 2), (2, 2), (2, 2)]
aux = collections.defaultdict(int)
for x, y in raw_data:
  aux[x, y] += 1

locations = sorted(set(x for x, y in raw_data))
hours = sorted(set(y for x, y in raw_data))
result = [(x, y, aux[x, y]) for x in locations for y in hours]

, если вы хотите, чтобы местоположения и часы отражали то, что находится в необработанных данных. Возможно, вы захотите использовать range(some, thing) для каждого из местоположений и часов вместо этого, если у вас есть независимая информация о диапазонах, которые должны охватывать как местоположения, так и часы, совершенно отдельно от того, какие часы и местоположения фактически находятся в raw_data.

1 голос
/ 15 мая 2010

Если вы получаете это из базы данных, почему бы не сделать запрос в первую очередь? Что-то вроде: SELECT hour, location, COUNT(*) FROM events GROUP BY hour, location ORDER BY hour, location.

В Python может быть что-то вроде этого:

timed_events = {}
# Count them up
for event in events_from_database:
    timed_events[event] = timed_events.setdefault(event, 0) + 1

# Form a new list with the original data plus the count
aggregate_list = [(evt[0], evt[1], count) for evt,count in events.items()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...