2013-04-04 14 views
5

Mam listę tokenów, który wygląda mniej więcej tak:Grupa lista/Hrabia słowników na podstawie wartości

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

Co chcę zrobić, to dostać rachubę, ile razy występuje każda wartość w lista tokenów.

w VB.NET zrobiłbym coś takiego ...

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

Co znajduje odpowiednik w Pythonie?

Odpowiedz

14

IIUC, można użyć 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}) 

jeśli trzeba tylko rachubę. Jeśli chcesz je pogrupowane według wartości, można użyć itertools.groupby i coś takiego:

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

choć jest to trochę trudniejsze, ponieważ groupby wymaga pogrupowane terminy być ciągłe, a więc trzeba posortować według klucza pierwszy.

+0

Dzięki, właśnie tego szukałem. Wciąż mam głowę dookoła pytonicznego podejścia do rzeczy – Basic

1
import collections 

# example token list 
tokens = [{'Value':'Blah', 'Start':0}, {'Value':'BlahBlah'}] 

count=collections.Counter([d['Value'] for d in tokens]) 
print count 

pokazuje

Counter({'BlahBlah': 1, 'Blah': 1}) 
0
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 
2

Załóżmy, że jest lista python, zawierające dictionnaries:

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

Jeden liner:

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