我有一个哈希列表,看起来像下面:
[{'campaign_id': 'cid2504649263',
'country': 'AU',
'impressions': 3000,
'region': 'Cairns',
'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
{'campaign_id': 'cid2504649263',
'country': 'AU',
'count': 9000,
'region': 'Cairns',
'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
{'campaign_id': 'cid2504649263',
'country': 'AU',
'count': 3000,
'region': 'Cairns',
'utcdt': datetime.datetime(2013, 6, 4, 7, 0)}]
有两个哈希需要被卷起来因为所有的维度都是相同的我需要求和计数。所以…如何在itertools中使用python组来完成此任务?还有别的办法吗?
rolled_up = [{'campaign_id': 'cid2504649263',
'count': 12000,
'region': 'Cairns',
'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
{'campaign_id': 'cid2504649263',
'country': 'AU',
'count': 3000,
'region': 'Cairns',
'utcdt': datetime.datetime(2013, 6, 4, 7, 0)}]
如果需要卷在一起的项是连续的,则
groupby是可以的。否则,您需要先对它们进行排序。我想collections.Counter
比较适合你
>>> import datetime
>>> from collections import Counter
>>> C = Counter()
>>> L = [{'campaign_id': 'cid2504649263',
... 'country': 'AU',
... 'count': 3000, # <== changed this to "count"
... 'region': 'Cairns',
... 'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
... {'campaign_id': 'cid2504649263',
... 'country': 'AU',
... 'count': 3000,
... 'region': 'Cairns',
... 'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
... {'campaign_id': 'cid2504649263',
... 'country': 'AU',
... 'count': 3000,
... 'region': 'Cairns',
... 'utcdt': datetime.datetime(2013, 6, 4, 7, 0)}]
>>> for item in L: # The ... represents the rest of the key
... C[item['campaign_id'], item['country'], ..., item['utcdt']] += item['count']
...
C
Counter({('cid2504649263', 'AU', datetime.datetime(2013, 6, 4, 6, 0)): 6000, ('cid2504649263', 'AU', datetime.datetime(2013, 6, 4, 7, 0)): 3000})
然后将Counter转换回列表格式
有两个哈希需要被卷起,因为所有的尺寸相同,我需要求和计数。
如果你只需要这些,可以这样写:
from collections import defaultdict
d = defaultdict(int)
for i in hashes:
d[i['campaign_id'],i['region']] += i['count']
for k in d:
print k[0],d[k]