2013-04-15 30 views
14

Tôi khá mới với python, nhưng tôi chưa thể tìm ra giải pháp cho vấn đề của mình ở bất cứ đâu.Đếm số lần xuất hiện trong danh sách các bộ dữ liệu

Tôi muốn đếm số lần xuất hiện của một chuỗi bên trong danh sách các bộ dữ liệu.

Dưới đây là danh sách các hàng:

list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
     ] 

Tôi đã thử điều này, nhưng nó chỉ in 0

for entry in list1: 
    print list1.count(entry[0]) 

Như cùng một ID xảy ra hai lần trong danh sách, điều này sẽ trở lại:

2 
1 

Tôi cũng đã cố gắng tăng số lượt truy cập cho mỗi lần xuất hiện của cùng một ID nhưng không thể nắm bắt được cách làm thế nào để wri te nó.

* CHỈNH SỬA: Sử dụng câu trả lời tuyệt vời của Eumiro. Tôi chỉ nhận ra rằng tôi đã không giải thích toàn bộ vấn đề. tôi thực sự cần tổng số tiền các mục trong đó có một giá trị hơn 1. Nhưng nếu tôi cố gắng thực hiện:

for name, value in list1: 

    if value > 1: 
     print value 

tôi nhận được lỗi này:

ValueError: Too many values to unpack 

Trả lời

24

lẽ collections.Counter thể giải quyết vấn đề của bạn:

from collections import Counter 
Counter(elem[0] for elem in list1) 

lợi nhuận

Counter({'12392': 2, '7862': 1}) 

Nhanh vì nó lặp lại trong danh sách của bạn chỉ một lần. Bạn lặp lại các mục nhập và sau đó cố gắng đếm số mục này trong danh sách của bạn. Điều đó không thể được thực hiện với .count, nhưng có thể được thực hiện như sau:

for entry in list1: 
    print sum(1 for elem in list1 if elem[0] == entry[0]) 

Nhưng nghiêm túc, có một cái nhìn tại collections.Counter.

EDIT: tôi thực sự cần tổng số tiền các mục trong đó có một giá trị hơn 1.

Bạn vẫn có thể sử dụng Counter:

c = Counter(elem[0] for elem in list1) 
sum(v for k, v in c.iteritems() if v > 1) 

lợi nhuận 2, tức là tổng số lượng cao hơn 1.

+0

'Số lượt truy cập' làm cho nó đơn giản như vậy – jamylak

+0

Cảm ơn! Điều đó thực sự đơn giản! Tôi chỉ nhận ra rằng tôi đã không giải thích toàn bộ vấn đề. Tôi đã cập nhật câu hỏi gốc. – mackwerk

+0

@Mackwerk - xem câu trả lời đã chỉnh sửa của tôi. – eumiro

4

list1.count(entry[0]) sẽ không hoạt động vì nó nhìn vào từng phần ee tuples trong list1, ví dụ: ('12392', 'some string', 'some other string') và kiểm tra xem chúng có bằng '12392' chẳng hạn, rõ ràng không phải như vậy.

Câu trả lời của @ eurmiro cho bạn biết cách thực hiện với Counter (đó là cách tốt nhất!) nhưng đây là phiên bản của người nghèo để minh họa cách Counter hoạt động bằng cách sử dụng từ điển và phương pháp dict.get(k, [,d]) sẽ cố gắng lấy khóa (k), nhưng nếu nó không tồn tại, nó sẽ trả về giá trị mặc định thay thế (d):

>>> list1 = [ 
     ('12392', 'some string', 'some other string'), 
     ('12392', 'some new string', 'some other string'), 
     ('7862', None, 'some other string') 
] 
>>> d = {} 
>>> for x, y, z in list1: 
     d[x] = d.get(x, 0) + 1 


>>> d 
{'12392': 2, '7862': 1} 
+0

Cool! Khá thú vị để xem nó hoạt động như thế nào :) – mackwerk