2010-03-19 39 views
8

Tôi có danh sách các từ điển. Tôi cần kiểm tra xem tất cả các từ điển trong danh sách đó có trống không. Tôi đang tìm kiếm một tuyên bố đơn giản sẽ làm điều đó trong một dòng.Python: Kiểm tra xem tất cả các từ điển trong danh sách có trống không

Có cách nào để thực hiện các bước sau (không bao gồm bản in) không?

l = [{},{},{}] # this list is generated elsewhere... 
all_empty = True 
for i in l: 
    if i: 
    all_empty = False 

print all_empty 

Có gì mới để trăn ... Tôi không biết nếu có cách viết tắt được xây dựng để kiểm tra điều này. Cảm ơn trước.

Trả lời

19
all(not d for d in l) 
+1

Làm việc như một sự quyến rũ. Cảm ơn. – Brant

+0

Ngoài ra 'tất cả (len (d) == 0 cho d trong l)', đó là chi tiết hơn về những gì "có sản phẩm nào" có nghĩa là. –

+0

Chi tiết hơn không có nghĩa là thêm pythonic, đó là lý do tại sao tôi thích phiên bản của Jimmy. –

10

not any(d for d in l) là tương đương bởi De Morgan's Law để all(not d for d in l), nhưng áp dụng chỉ là một not điều hành. Hành vi đoản mạch cũng tương đương.

Chỉnh sửa 1: genexp bên trong thực sự (vô hại nhưng) dư thừa: not any(l) nhanh hơn và ngắn gọn hơn.

Chỉnh sửa 2: Một nhận xét tuyên bố rằng all(not d for d in l) là "nhiều hơn những gì bạn muốn bày tỏ" hơn not any(l), và tôi phản đối kịch liệt: ngay cả trong ngôn ngữ tự nhiên, "tất cả các mục của danh sách là không có dân" không được nữa bình thường, trực tiếp hoặc rõ ràng hơn "không có mục nào trong danh sách được điền" - ngoài sự tương đương logic tuyệt đối theo luật logic, hai cách diễn đạt rất gần và tương đương về tâm lý con người.

+7

"không phải bất kỳ (l)" là đủ. –

+1

Wow, ai đó đã từng là một siêu thị: D –

+0

Mặc dù, đó là câu hỏi hóc búa cũ: Jimmy gần với những gì bạn thực sự muốn thể hiện (tất cả trống), trong khi 'không có bất kỳ (l)' nào (có lẽ, thiên đường ' t đo nó) nhanh hơn. –

10

not any(d for d in l) có thể được rút ngắn thành chỉ not any(l) trong trường hợp này.

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