【问题标题】:Python create Counter object from dictionary, include a sum of values against summarised keysPython 从字典创建 Counter 对象,包括针对汇总键的值总和
【发布时间】:2013-06-15 12:21:35
【问题描述】:

我有一本带有 {ID: (INITIALS, DATE, AREA)} 的字典,如下所示:

>> mydict = {1: ('JN', '2012-06-13', 2),
             2: ('JN', '2012-06-13', 5),
             3: ('JN', '2012-06-14', 8),
             4: ('AM', '2012-06-13', 3),
             5: ('OV', '2012-06-14', 4)}

我已经能够总结出这样的价值观:

>> from collections import Counter
>> mycounter = Counter((val[0], val[1]) for val in mydict.values())
>> for (initials, date), count in mycounter.iteritems():
       print ', '.join(initials, date, str(count))

JN, 2012-06-13, 2
JN, 2012-06-14, 1
AM, 2012-06-13, 1
OV, 2012-06-14, 1

我还想在 mydict 中包含该值的 AREA 总和,结果如下:

JN, 2012-06-13, 2, 7
JN, 2012-06-14, 1, 8
AM, 2012-06-13, 1, 3
OV, 2012-06-14, 1, 4

谢谢!


编辑:工作代码(根据 Ashwini 的代码稍作修改): 我将 v[1] 移动到一个元组中加入 v[0] ,因此它将根据首字母和日期进行汇总(我在最初的问题中没有说清楚,现在进行了编辑以反映这一点),然后计算计数和对区域求和。 Martijn 的代码也有效,但这个解决方案需要少一次导入。

stats = {}
for k, v in mydict.items():
    d = stats.setdefault((v[0], v[1]), [0, 0])
    d[1] += v[-1]
    d[0] += 1

【问题讨论】:

    标签: python dictionary sum counter


    【解决方案1】:

    你可以在这里使用普通的字典:

    >>> dic = {}
    for k, v in mydict.items():
        d = dic.setdefault(v[0], [v[1], 0, 0])
        d[2] += v[-1]
        d[1] += 1
    ...     
    >>> dic
    {'OV': ['2012-06-14', 1, 4],
     'JN': ['2012-06-13', 2, 7],
     'AM': ['2012-06-13', 1, 3]}
    

    遍历dict得到预期的输出:

    >>> for k,v in dic.items():
        print k +',',", ".join([str(x) for x in v])
    ...     
    OV, 2012-06-14, 1, 4
    JN, 2012-06-13, 2, 7
    AM, 2012-06-13, 1, 3
    

    如果订单很重要,那么您可以使用collections.OrderedDict:

    >>> from collections import OrderedDict
    >>> dic = OrderedDict()
    >>> for k, v in mydict.items():
             d = dic.setdefault(v[0], [v[1], 0, 0])
             d[2] += v[-1]
             d[1] += 1
    
    >>> for k,v in dic.items():
    ...         print k +',',", ".join([str(x) for x in v])
    ...     
    JN, 2012-06-13, 2, 7
    AM, 2012-06-13, 1, 3
    OV, 2012-06-14, 1, 4
    

    【讨论】:

      【解决方案2】:

      您在这里没有使用完整的 Counter API,不妨将其替换为 defaultdict

      from collections import defaultdict
      
      stats = defaultdict(lambda: [0, 0])
      
      for entry in mydict.values():
          counts = stats[tuple(entry[:2])]
          counts[0] += 1
          counts[1] += entry[-1]
      

      然后打印:

      for (initials, date), (count, area) in stats.iteritems():
          print ', '.join((initials, date, str(count), str(area)))
      

      哪个输出:

      OV, 2012-06-14, 1, 4
      AM, 2012-06-13, 1, 3
      JN, 2012-06-13, 2, 7
      

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 2014-06-21
        相关资源
        最近更新 更多