【问题标题】:Keep count and append it to a list in python保持计数并将其附加到python中的列表中
【发布时间】:2020-09-05 13:01:24
【问题描述】:

我有一个类似这样的列表。

data = [
      {'time': 10, 'data': 'abcd'}
      {'time': 10, 'data': 'abcd'}
      {'time': 11, 'data': 'bcd'}
      {'time': 12, 'data': 'dc'}
      {'time': 13, 'data': 'ak'}
      {'time': 11, 'data': 'bcd'}

我需要计算相同的数据对象并保持数据的计数。我期待这样的输出。

Expected Output:

data = [
      {'time': 10, 'data': 'abcd','count' : 2}
      {'time': 11, 'data': 'bcd','count' : 2}
      {'time': 12, 'data': 'dc','count' : 1}
      {'time': 13, 'data': 'ak','count' : 1}

有可能吗?我正在尝试在 python 中执行此操作。

【问题讨论】:

  • edit您的问题以正确格式化您的代码。这不是有效的 Python 或 JSON 语法。到目前为止,您尝试过什么来解决这个问题?你熟悉 Python 中的循环吗?对于 data 匹配但不匹配 time 的条目,您期望什么行为,反之亦然?

标签: python json python-3.x list hashmap


【解决方案1】:

虽然我这样做的方式不是很有效,但可以通过遍历字典并检查 timedata 键的值是否相同来进行计数:

data = [
    {'time': 10, 'data': 'abcd'},
    {'time': 10, 'data': 'abcd'},
    {'time': 11, 'data': 'bcd'},
    {'time': 12, 'data': 'dc'},
    {'time': 13, 'data': 'ak'},
    {'time': 11, 'data': 'bcd'}
]

data_counted = []
for d in data:
    for d_c in data_counted:
        if d['time'] == d_c['time'] and d['data'] == d_c['data']:
            d_c['count'] += 1
            break
    else:
        d_new = d.copy()
        d_new['count'] = 1
        data_counted.append(d_new)

print(data_counted)
[{'time': 10, 'data': 'abcd', 'count': 2}, 
 {'time': 11, 'data': 'bcd', 'count': 2}, 
 {'time': 12, 'data': 'dc', 'count': 1}, 
 {'time': 13, 'data': 'ak', 'count': 1}]

【讨论】:

    【解决方案2】:

    您可以使用itertools.groupby 对具有相同data 值的字典进行分组:

    from itertools import groupby
    
    def keyFunc(d):
        return d['data']
    
    def merge(*dicts):
        return {**dicts[0], 'count': len(dicts)}
    
    merged = [merge(*g) for i, g in groupby(sorted(data, key=keyFunc), key=keyFunc)]
    print(merged)
    

    由此产生的merged dict 将是:

    [
     {'count': 2, 'data': 'abcd', 'time': 10},
     {'count': 1, 'data': 'ak', 'time': 13},
     {'count': 2, 'data': 'bcd', 'time': 11},
     {'count': 1, 'data': 'dc', 'time': 12}
    ]
    

    【讨论】:

      【解决方案3】:

      我不确定这有多有效,但它应该可以完成工作。

      data = [
            {'time': 10, 'data': 'abcd'},
            {'time': 10, 'data': 'abcd'},
            {'time': 11, 'data': 'bcd'},
            {'time': 12, 'data': 'dc'},
            {'time': 13, 'data': 'ak'},
            {'time': 11, 'data': 'bcd'},
      ]
      
      temp = {}
      
      for i in data:
          s = "{}-{}".format(i['time'], i['data'])
          i['count'] = 1
      
          if (s not in temp.keys()):
              temp[s] = i
          else:
              temp[s]['count'] += 1
      
      data = [temp[i] for i in temp.keys()]
      
      print(data)
      
      
      [{'count': 2, 'data': 'abcd', 'time': 10}, 
      {'count': 2, 'data': 'bcd', 'time': 11}, 
      {'count': 1, 'data': 'dc', 'time': 12}, 
      {'count': 1, 'data': 'ak', 'time': 13}] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-26
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        相关资源
        最近更新 更多