【问题标题】:Group/Count list of dictionaries based on value基于值的字典分组/计数列表
【发布时间】:2013-03-26 19:24:45
【问题描述】:

我有一个令牌列表,看起来像:

[{
    Value: "Blah",
    StartOffset: 0,
    EndOffset: 4
}, ... ]

我想要做的是计算每个值在标记列表中出现的次数。

在 VB.Net 中,我会做类似...

Tokens = Tokens.
GroupBy(Function(x) x.Value).
Select(Function(g) New With {
           .Value = g.Key,
           .Count = g.Count})

Python 中的等价物是什么?

【问题讨论】:

    标签: python list aggregate-functions


    【解决方案1】:

    IIUC,你可以使用collections.Counter

    >>> from collections import Counter
    >>> tokens = [{"Value": "Blah", "SO": 0}, {"Value": "zoom", "SO": 5}, {"Value": "Blah", "SO": 2}, {"Value": "Blah", "SO": 3}]
    >>> Counter(tok['Value'] for tok in tokens)
    Counter({'Blah': 3, 'zoom': 1})
    

    如果您只需要计数。如果您希望它们按值分组,您可以使用 itertools.groupby 和类似的东西:

    >>> from itertools import groupby
    >>> def keyfn(x):
            return x['Value']
    ... 
    >>> [(k, list(g)) for k,g in groupby(sorted(tokens, key=keyfn), keyfn)]
    [('Blah', [{'SO': 0, 'Value': 'Blah'}, {'SO': 2, 'Value': 'Blah'}, {'SO': 3, 'Value': 'Blah'}]), ('zoom', [{'SO': 5, 'Value': 'zoom'}])]
    

    虽然这有点棘手,因为groupby 要求分组的术语是连续的,因此您必须先按键排序。

    【讨论】:

    • 谢谢,这正是我所追求的。我仍然对 Python 的处理方法有所了解
    【解决方案2】:

    假设这是你的 python 列表,包含字典:

    my_list = [{'Value': 'Blah',
                'StartOffset': 0,
                'EndOffset': 4},
               {'Value': 'oqwij',
                'StartOffset': 13,
                'EndOffset': 98},
               {'Value': 'Blah',
                'StartOffset': 6,
                'EndOffset': 18}]
    

    一个班轮:

    len([i for i in a if i['Value'] == 'Blah']) # returns 2
    

    【讨论】:

      【解决方案3】:
      import collections
      
      # example token list
      tokens = [{'Value':'Blah', 'Start':0}, {'Value':'BlahBlah'}]
      
      count=collections.Counter([d['Value'] for d in tokens])
      print count
      

      表演

      Counter({'BlahBlah': 1, 'Blah': 1})
      

      【讨论】:

        【解决方案4】:
        token = [{
            'Value': "Blah",
            'StartOffset': 0,
            'EndOffset': 4
        }, ... ]
        
        value_counter = {}
        
        for t in token:
            v = t['Value']
            if v not in value_counter:
                value_counter[v] = 0
            value_counter[v] += 1
        
        print value_counter
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-01
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-18
          • 1970-01-01
          相关资源
          最近更新 更多