2013-09-22 34 views
5

Tôi có một danh sách các từ điển (viết tắt).Làm cách nào để đếm số lần xuất hiện của một mục trong danh sách từ điển?

my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 

Làm thế nào tôi có thể đếm số lần xuất hiện của từ điển với một giá trị xác định cho một phím đặc biệt (trong trường hợp này 'id')? Có cách nào để tận dụng count (my_list.count('id' = 1)?!?)

Trả lời

7

Làm thế nào về

sum(1 for d in my_list if d.get('id') == the_value_you_are_interested_in) 

>>> my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 
>>> sum(1 for d in my_list if d.get('id') == 1) 
1 
>>> sum(1 for d in my_list if d.get('id') == 2) 
2 
>>> sum(1 for d in my_list if d.get('id') == 20) 
0 

Lưu ý việc sử dụng các máy phát điện chứ không phải là một danh sách của 1s. Đây là một kỹ thuật khá thành lập và có thể xuất hiện trên một số câu hỏi StackOverflow.

Tôi không thấy bất kỳ cách nào để tận dụng list.count(x) vì phương pháp này tính số lần xuất hiện của x, mà trong trường hợp của bạn sẽ là từ điển hoàn chỉnh. Python có một phương pháp filter, nhưng hiểu được nhiều ưu tiên.

+0

Tôi không hiểu thông điệp của bạn trong dòng cuối cùng trong câu trả lời - python học. –

+2

Nếu tôi viết 'tổng ([1 cho x trong a])' và 'a' là một danh sách rất lớn, thì danh sách hiểu về mặt lý thuyết tạo ra một danh sách rất lớn 1s, THEN tổng hợp tất cả chúng. Nhưng nếu tôi viết 'tổng (1 cho x trong a)' thì các số 1 được tổng kết là 'a' đang được lặp lại, mà không có cấu trúc lớn được nhận ra. –

+0

OK! thông tin rất hữu ích cho tôi. Cảm ơn bạn rất nhiều. –

6

Tôi thích câu trả lời của @ Ray. Một mẹo hay khác là sử dụng collections.Counter.

from collections import Counter 

c = Counter(item for dct in my_list for item in dct.items()) 
c 
=> Counter({('id', 2): 2, ('val', 123): 1, ('id', 1): 1, ('val', 456): 1, ('val', 789): 1}) 

c[('id', 2)] 
=> 2 
c[('id', 1)] 
=> 1 
c[('id', 20)] 
=> 0 

Giải pháp này đặc biệt tốt nếu bạn cần đếm nhiều khóa/giá trị.

Nếu bạn chỉ quan tâm đến một phím cụ thể, bạn có thể làm:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
Các vấn đề liên quan