2013-04-04 31 views
5

Tôi đã có một danh sách các Token mà trông giống như sau:Nhóm danh sách/Tính của từ điển dựa trên giá trị

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

Những gì tôi muốn làm là có được một số lượng bao nhiêu lần mỗi giá trị xảy ra trong danh sách các thẻ.

Trong VB.Net Tôi muốn làm điều gì đó giống như ...

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

tương đương bằng Python là gì?

Trả lời

14

IIUC, bạn có thể sử dụng 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}) 

nếu bạn chỉ cần một số. Nếu bạn muốn họ nhóm lại theo giá trị, bạn có thể sử dụng itertools.groupby và một cái gì đó như:

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

mặc dù đó là một phức tạp hơn chút vì groupby đòi hỏi các điều khoản nhóm được tiếp giáp, và do đó bạn phải sắp xếp theo chìa khóa đầu tiên.

+0

Cảm ơn, đó là chính xác những gì tôi đã sau. Tôi vẫn nhận được đầu của tôi xung quanh cách tiếp cận pythonic với những thứ – 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 

lãm

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

Giả sử đó là danh sách python của bạn, chứa dictionnaries:

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

Một lót:

len([i for i in a if i['Value'] == 'Blah']) # returns 2 
Các vấn đề liên quan