Group/Count list of dictionaries based on value

前端 未结 4 1648
小蘑菇
小蘑菇 2021-02-13 13:38

I\'ve got a list of Tokens which looks something like:

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

What I want to do

相关标签:
4条回答
  • 2021-02-13 14:00
    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
    
    0 讨论(0)
  • 2021-02-13 14:02

    IIUC, you can use 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})
    

    if you only need a count. If you want them grouped by the value, you could use itertools.groupby and something like:

    >>> 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'}])]
    

    although it's a little trickier because groupby requires the grouped terms to be contiguous, and so you have to sort by the key first.

    0 讨论(0)
  • 2021-02-13 14:12
    import collections
    
    # example token list
    tokens = [{'Value':'Blah', 'Start':0}, {'Value':'BlahBlah'}]
    
    count=collections.Counter([d['Value'] for d in tokens])
    print count
    

    shows

    Counter({'BlahBlah': 1, 'Blah': 1})
    
    0 讨论(0)
  • 2021-02-13 14:22

    Let's assume that is your python list, containing dictionnaries:

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

    A one liner:

    len([i for i in a if i['Value'] == 'Blah']) # returns 2
    
    0 讨论(0)
提交回复
热议问题