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

Python和collections.counter-如何使元素动态,python,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

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

  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]

正如我在评论中提到的,您可以使用带有预定义默认值的,如果dict中不存在该键,将返回该值

default_region = 'default_region'
...
...
item.get('region', default_region)
如果您有许多您认为可能不在您的dict中的键,那么如果适合您的目的,您可以使用()。或者,您可以简单地创建默认值的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])

如果区域不存在,您会假定该区域的默认值是什么?为什么不使用
item.get('region',default)
?@mg007您应该添加
item.get('region','default')
作为答案。它需要是dynainc..而不仅仅是region..如果我有100个键呢?那么计数器中的键是公共字段的交点?这不是个好主意,因为两个字典可能有不同的键子集,但值相同
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])