基于值的组/计数字典列表

Bas*_*sic 8 python list aggregate-functions

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

[{
    Value: "Blah",
    StartOffset: 0,
    EndOffset: 4
}, ... ]
Run Code Online (Sandbox Code Playgroud)

我想要做的是计算每个值在令牌列表中出现的次数.

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

Tokens = Tokens.
GroupBy(Function(x) x.Value).
Select(Function(g) New With {
           .Value = g.Key,
           .Count = g.Count})
Run Code Online (Sandbox Code Playgroud)

什么是Python中的等价物?

DSM*_*DSM 22

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})
Run Code Online (Sandbox Code Playgroud)

如果你只需要一个计数.如果您希望按值分组,则可以使用以下内容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'}])]
Run Code Online (Sandbox Code Playgroud)

虽然它有点棘手,因为groupby要求分组的术语是连续的,所以你必须先按键排序.


Pac*_*aco 5

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

my_list = [{'Value': 'Blah',
            'StartOffset': 0,
            'EndOffset': 4},
           {'Value': 'oqwij',
            'StartOffset': 13,
            'EndOffset': 98},
           {'Value': 'Blah',
            'StartOffset': 6,
            'EndOffset': 18}]
Run Code Online (Sandbox Code Playgroud)

一个班轮:

len([i for i in a if i['Value'] == 'Blah']) # returns 2
Run Code Online (Sandbox Code Playgroud)