2016-02-07 14 views
21

Tôi muốn kiểm tra xem tất cả các giá trị, tức là các giá trị tương ứng với tất cả các phím trong từ điển là 0. Có cách nào để thực hiện nó mà không có vòng lặp không? Nếu thế thì sao?Làm thế nào để kiểm tra xem tất cả các giá trị của một từ điển là 0, bằng Python?

+0

Làm sao bạn làm điều đó với một vòng lặp? –

+0

i lặp qua từ điển và kiểm tra tất cả các giá trị tức là các giá trị tương ứng với tất cả các khóa nếu ngay cả một giá trị không đúng, tôi đã thay đổi giá trị cờ và thoát ra khỏi vòng lặp. –

Trả lời

45

sử dụng all():

all(value == 0 for value in your_dict.values()) 

all lợi nhuận True nếu tất cả các yếu tố của trao iterable là đúng sự thật.

4

Bạn có thể sử dụng phương pháp any(), về cơ bản nó kiểm tra các tham số boolean, nhưng 0 sẽ hoạt động như Sai trong trường hợp này và bất kỳ số nào khác là True. Hãy thử mã này:

dict1 = {"a": 0, "b": 1} 
dict2 = {"a": 0, "b": 0} 

print not any(dict1.itervalues()) 
print not any(dict2.itervalues()) 

Output:

False 
True 

Edit2: một sidenote/thận trọng, kêu gọi bất kỳ() với danh sách trống của các yếu tố sẽ trở lại False.

+1

'all' cũng lười. – timgeb

+0

@timgeb đúng, cảm ơn bạn đã bình luận – Fanchi

+3

Điều này sẽ cho kết quả không chính xác cho bất kỳ giá trị falsey nào, [], Không, {} vv .. –

7

Với all:

>>> d = {1:0, 2:0, 3:1} 
>>> all(x==0 for x in d.values()) 
False 
>>> d[3] = 0 
>>> all(x==0 for x in d.values()) 
True 

Không có vấn đề cho dù bạn sử dụng any hoặc all, việc đánh giá sẽ được lười biếng. all trả về False trên giá trị giả đầu tiên mà nó gặp phải. any trả về True trên giá trị thực tế đầu tiên mà nó gặp phải.

Do đó, not any(d.values()) sẽ cung cấp cho bạn kết quả tương tự cho từ điển mẫu mà tôi đã cung cấp. Nó ngắn hơn một chút so với phiên bản all với máy phát hiểu. Cá nhân, tôi vẫn thích các biến thể all tốt hơn bởi vì nó thể hiện những gì bạn muốn mà không cần người đọc phải thực hiện sự phủ định logic trong đầu.

Có một vấn đề nữa với việc sử dụng any đây, mặc dù:

>>> d = {1:[], 2:{}, 3:''} 
>>> not any(d.values()) 
True 

Từ điển không chứa giá trị 0, nhưng not any(d.values()) sẽ trở lại True bởi vì tất cả các giá trị là falsy, tức là bool(value) lợi nhuận False cho một danh sách trống , từ điển hoặc chuỗi.

Tóm lại: số khả năng đọc, rõ ràng, sử dụng giải pháp all.

+0

'không phải bất kỳ' sẽ đánh giá là True nếu tất cả các giá trị là _falsey_, vì vậy nó khác với kiểm tra nếu tất cả các giá trị bằng với' 0'. –

2

Bạn cũng có thể làm điều đó theo cách khác sử dụng bất kỳ:

>>> any(x != 0 for x in somedict.values()) 

Nếu nó trả về True, sau đó tất cả các phím không 0, nếu không tất cả các phím 0

Các vấn đề liên quan