Python和collections.counter - 如何使元素动态化

时间:2013-06-12 08:57:54

标签: python

我需要向计数器添加项目,并且需要更加动态。

  hash_data = [{'campaign_id': 'cid2504649263',
  'country': 'AU',
  'impressions': 9000,
  'region': 'Cairns',
  'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
 {'campaign_id': 'cid2504649263',
  'country': 'AU',
  'impressions': 3000,
  'region': 'Cairns',
  'utcdt': datetime.datetime(2013, 6, 4, 6, 0)},
 {'campaign_id': 'cid2504649263',
  'country': 'AU',
  'impressions': 3000,
  'utcdt': datetime.datetime(2013, 6, 4, 7, 0)}]

例如,哈希列表中的最后一个元素不包含区域。然而,下面是我添加元素的方式,并会出错。

C = Counter()
for item in hash_data:
    C[item['utcdt'],item['campaign_id'], item['country'], item['region']] += item[metric]

理想情况下这样但当然不起作用

C = Counter()
for item in hash_data:
    m1 = item.keys()
    m2 = []
    for i in ml:
        if i!='impression':
           ms.add(i)
    C[ml] += item[metric]

2 个答案:

答案 0 :(得分:1)

C = Counter()
for item in hash_data:
  C[tuple(item.values())] += item[metric]

答案 1 :(得分:0)

正如我在评论中提到的,你可以使用dict.get预定义的默认值,如果dict中没有键,将返回该值。

default_region = 'default_region'
...
...
item.get('region', default_region)

如果你认为你的dict中可能缺少许多键,如果符合你的目的,你可以使用collections.defaultdictSee this discussion)。或者,您只需创建一个包含所有可能键及其相应默认值的默认值的dict。一个小例子可能是:

defaults = {
            'campaign_id': 'default_campaign_id',
            'country': 'default_country',
            'impressions': -1,
            'region': 'default_region',
            'utcdt': datetime.datetime.min,
           }

for item in hash_data:
    C[tuple(item.get(k, dv) for k, dv in defaults.items() if k != metric)] += item.get(metric, defaults[metric])

HTH!