2010-05-15 23 views
1

我是Python的新手,所以如果我的問題看起來微不足道,請提前道歉。我如何重塑和聚合Python中的元組列表?

從psycopg2查詢我有一個元組列表的形式,結果看起來像:

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

每個元組表示其中的事件發生了,一天的時間,當事件發生的地點的ID。

我想重塑和彙總此列表彙總在每個位置的每個小時,它看起來像的形式:

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

如果每個touple現在就告訴我說,例如: 位置1,0小時有2個事件; 位置1,第1小時有1個事件; 等等...

如果有在特定小時0的事件,我還是想看到它,例如在0時在位置2 0的事件:(2,0,0)

我如何在Python中實現它?

編輯:感謝您的幫助!

+0

這兩個解決方案都做我想要的。 我太無知,從Python的角度來判斷哪種解決方案更好......但是Kylotan的SQL也是非常有幫助的提示。 – radek 2010-05-16 19:31:04

回答

1

如果你從數據庫中得到這個信息,爲什麼不把查詢放在第一位呢?例如: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()] 
+0

+1表示讓數據庫做到這一點。 – 2010-05-15 19:59:55

+0

感謝您的答覆Kylotan。 SQL解決方案確實有幫助,但不會給我零事件,如(2,0,0)。 Python工作得很好:] – radek 2010-05-16 19:24:49

2

喜歡的東西...:

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中實際發生的小時和位置完全分開。

+0

謝謝亞歷克斯。正是我想要的:] – radek 2010-05-16 19:25:28