2013-04-04 19 views
5

Ho un elenco di token che sembra qualcosa di simile:Gruppo Lista/Conte di dizionari in base al valore

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

Quello che voglio fare è ottenere un conteggio di quante volte ogni valore si verifica nel elenco di token.

In VB.Net che avrei fatto qualcosa di simile ...

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

Qual è l'equivalente in Python?

risposta

14

IIUC, è possibile utilizzare 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}) 

se è necessario solo un conteggio. Se si desidera loro raggruppati in base al valore, si potrebbe usare itertools.groupby e qualcosa come:

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

anche se è un po 'più complicato, perché groupby richiede i termini raggruppati per essere contigui, e quindi si deve ordinare in base alla chiave di prima.

+0

Grazie, è esattamente quello che stavo cercando. Sto ancora cercando di capire l'approccio pitonico alle cose – 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 

mostra

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

Supponiamo che è la vostra lista di pitone, contenenti dictionnaries:

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

A uno di linea:

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