2012-11-19 39 views
20

câu hỏi đầu tiên ở đây, vì vậy tôi sẽ nhận được ngay với nó:Python số 2,7 Đếm các hạng mục từ điển với giá trị nhất định

sử dụng python 2.7

Tôi có một cuốn từ điển các mặt hàng, các phím là một x, y tọa độ được biểu diễn dưới dạng bộ tuple: (x, y) và tất cả các giá trị là các giá trị Boolean.

Tôi đang cố gắng tìm ra phương pháp nhanh chóng và sạch sẽ để đếm số lượng mục có giá trị nhất định. Tôi KHÔNG cần biết chìa khóa nào có giá trị nhất định, chỉ bao nhiêu.

có bài đăng tương tự tại đây: How many items in a dictionary share the same value in Python, tuy nhiên tôi không cần từ điển được trả về, chỉ là số nguyên.

Suy nghĩ đầu tiên của tôi là lặp lại các mục và kiểm tra từng mục trong khi vẫn giữ một giá trị của mỗi giá trị True. Tôi chỉ tự hỏi, vì tôi vẫn còn mới với python và không biết tất cả các thư viện, nếu có một cách tốt hơn/nhanh hơn/đơn giản hơn để làm điều này.

cảm ơn trước.

Trả lời

30

Phần đầu tiên này chủ yếu là để giải trí - tôi có thể sẽ không sử dụng nó trong mã của mình.

sum(d.values()) 

sẽ nhận được số giá trị True. (Tất nhiên, bạn có thể nhận được số lượng các giá trị False bởi len(d) - sum(d.values())).


Hơi hơn nói chung, bạn có thể làm điều gì đó như:

sum(1 for x in d.values() if some_condition(x)) 

Trong trường hợp này, if x công trình tốt ở vị trí của if some_condition(x) và là những gì hầu hết mọi người sẽ sử dụng trong mã thực tế)

TRONG BA GIẢI PHÁP TÔI ĐÃ ĐƯỢC ĐĂNG KÝ Ở ĐÂY, TRÊN LÀ LÀ ĐẶC BIỆT NHẤT VÀ LÀ MỘT NGƯỜI TÔI KHUYẾN NGHỊ


Cuối cùng, tôi cho rằng điều này có thể được viết khéo léo hơn một chút:

sum(x == chosen_value for x in d.values()) 

này nằm trong bối cảnh đó như (vui vẻ) đầu tiên của tôi giải pháp vì nó dựa trên thực tế là True + True == 2. Clever không phải lúc nào cũng tốt hơn. Tôi nghĩ rằng hầu hết mọi người sẽ xem xét phiên bản này là một chút ít mơ hồ hơn so với một ở trên (và do đó tồi tệ hơn).

+0

tuyệt vời. đó là chính xác những gì tôi muốn. tôi sẽ upvote nhưng tôi không thể vì bài đầu tiên của tôi và tôi không có đại diện.tôi nghĩ rằng tôi đánh dấu câu trả lời hữu ích mặc dù :) – jguerra

+0

@RocketDonkey bạn đã có một câu trả lời hợp lệ mặc dù - bạn nên để nó :) –

+0

Tôi vẫn thích 'tổng hợp (1 cho tôi trong một cái gì đó nếu tôi)' mặc dù ... (và những gì bạn đang làm gì với '== True' @mgilson)!? –

8

Nếu bạn muốn có một cấu trúc dữ liệu mà bạn có thể nhanh chóng truy cập vào kiểm tra tổng số, bạn có thể thử sử dụng một cần kê đơn (như @mgilson chỉ ra, điều này phụ thuộc vào các giá trị bản thân là hashable):

>>> from collections import Counter 
>>> d = {(1, 2): 2, (3, 1): 2, (4, 4): 1, (5, 6): 4} 
>>> Counter(d.values()) 
Counter({2: 2, 1: 1, 4: 1}) 

Sau đó bạn có thể cắm vào một giá trị và nhận được số lần nó xuất hiện:

>>> c = Counter(d.values()) 
>>> c[2] 
2 
>>> c[4] 
1 
Các vấn đề liên quan