【问题标题】:How to count multiple items in a list如何计算列表中的多个项目
【发布时间】:2019-01-12 18:47:10
【问题描述】:

我有以下清单:

data = [[2004,1,1,1,50], [2008,2,28,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

数据代表年、月、日、星期几、计数。

我想获取一周中每天的总计数字典。像这样的

results = {1:200,
           2:0,
           3:20,
           4:0,
           5:0,
           6:0,
           7:40,
}

我相信最好的方法是使用 collections.Counter,如果我错了,请纠正我。我放弃了这项努力来理解字典,但一直无法解决问题

solution = {(x,i) for x[3], i[4] in data}

【问题讨论】:

    标签: python dictionary counter


    【解决方案1】:

    由于您想求和而不是计数,因此使用defaultdict 可能更容易:

    from collections import defaultdict
    
    data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]
    
    c = defaultdict(int)
    
    for l in data:
        c[l[3]] += l[4]
    
    print(c)
    # defaultdict(<class 'int'>, {1: 200, 3: 20, 7: 40})
    

    如果你坚持零条目,你可以在之前实例化它:

    from collections import defaultdict
    
    data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]
    
    c = defaultdict(int)
    c.update({d: 0 for d in range(1, 8)})
    for l in data:
        c[l[3]] += l[4]
    print(c)
    # defaultdict(<class 'int'>, {1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40})
    

    此时,如果您确定输入不会包含无效日期,则可以在 defaultdict 上使用普通字典:

    data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]
    
    c = {d: 0 for d in range(1, 8)} # or dict.fromkeys(range(1, 8), 0)
    for l in data:
        c[l[3]] += l[4]
    print(c)
    # {1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40}
    

    【讨论】:

    • 请注意,您可以在此处创建c,而无需dict-comp,例如:c = dict.fromkeys(range(1, 8), 0)...
    【解决方案2】:

    如果在您的输入数据中,您的 data 按星期几排序,即特定星期几的所有子列表彼此相邻,您可以将 itertools.groupby 与字典理解一起使用:

    from itertools import groupby
    from operator import itemgetter
    
    res = {k: sum(map(itemgetter(-1), v)) for k, v in groupby(data, key=itemgetter(-2))}
    
    print(res)
    # {1: 200, 3: 20, 7: 40}
    

    如果您的数据未排序,则必须按星期几排序首先

    data = sorted(data, key=itemgetter(-2))
    

    【讨论】:

      【解决方案3】:

      你可以用一个简单的循环来解决这个问题。创建一个结果字典,将每天的初始值设置为零,然后逐步添加。

      results = {k:0 for k in range(1,8)}
      #Output: {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0}
      data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]
      
      for x in data:
          results[x[3]] += x[4]
      
      print(results)
      #Output:
      {1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40}
      

      【讨论】:

        【解决方案4】:

        当您要求使用集合中的 Counter 时,您可以像这样使用它:

        from collections import Counter
        
        counter=Counter()
        
        for group in data:
            counter[group[3]] +=group[4]
        
        results=dict(counter)
        

        【讨论】:

        • 不错,但是Counter 已经是dict 的子类,不需要dict(counter)
        • 你能告诉我为什么这样的东西行不通,但你的行吗?为数据中的项目导入集合\n:\n collections.Counter[item[3] +=item[4]
        • collections.Counter 是一个类。您需要此类的一个实例并使用该实例:“counter=collections.Counter()”。正如 DeepSpace 所提到的,Counter 是 dict 的子类,因此您可以使用括号来添加键值对:counter[key] = value。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多