2010-05-15 3 views
1

저는 제 질문이 사소한 것처럼 보이는 경우 사전 사과로 파이썬에 대한 신조입니다.파이썬에서 튜플 목록을 어떻게 변형하고 모을 수 있습니까?

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

각 튜플 이벤트가 발생한 경우 이벤트가 발생하고 하루의 시간 위치의 ID를 나타냅니다하십시오 psycopg2 쿼리에서

내가 좋아하는보고 튜플의리스트의 형태로 결과가 있습니다.

나는 그것이 보이는 형태로 바꿀 및 각 위치에있는 각 시간 소계이 목록을 집계하고 싶습니다

같은 :

[(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 이벤트가 있다면, 나는 아직도 예를 들어 위치 2 0 시간 동안 0 이벤트로, 그것을보고 싶습니다 (2, 0, 0)

어떻게 파이썬으로 구현할 수 있습니까?

편집 : 도움을 주셔서 감사합니다!

+0

두 솔루션 모두 내가 원하는 것을 정확하게 처리합니다. 나는 파이썬의 관점에서 어느 솔루션이 더 나은지 판단하기에는 너무 무지합니다. 그러나 Kylotan의 SQL은 매우 유용한 힌트였습니다. – radek

답변

1

데이터베이스에서이 문제가 발생하는 경우 쿼리를 사용하면 어떨까요? 다음과 같음 : SELECT hour, location, COUNT(*) FROM events GROUP BY hour, location ORDER BY hour, location. 파이썬이 같은 아마 뭔가에

:

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. –

+0

답장을 보내 주셔서 감사합니다. SQL 솔루션은 실제로 도움이되지만 (2, 0, 0)과 같은 제로 이벤트를주지 않을 것입니다. 파이썬은 매우 잘 작동합니다.] – radek

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] 

당신은 위치와 시간이 원시 데이터에 무엇이 반영하려는 경우. 위치와 시간이 모두 포함되어야하는 범위에 대한 독립적 인 정보가 있고 실제로 시간과 위치가 서로 다른 경우 raw_data 인 경우 각 위치와 시간에 range(some, thing)을 사용하는 것이 좋습니다.

+0

Alex. 정확히 내가 원하는 걸 :] – radek

관련 문제