2011-08-13 39 views

Trả lời

7

Bạn có thể sử dụng all() với một generator expression:

>>> all(x in dct for x in ('foo', 'bar', 'qux')) 
False 
>>> all(x in dct for x in ('foo', 'bar', 'baz')) 
True 
>>> 

Nó giúp bạn tiết kiệm một con số khổng lồ 2 ký tự (nhưng sẽ giúp bạn tiết kiệm hơn rất nhiều nếu bạn có một danh sách nhiều thời gian để kiểm tra).

+1

Chấp nhận câu trả lời này nhờ vào việc bao gồm các liên kết hữu ích. :) – davidchambers

+0

… mặc dù nó lặp lại câu trả lời trước đó của @ unutbu. –

+0

@flying sheep: Không có câu trả lời nào khi tôi bắt đầu nhập tên của tôi. Tôi đoán unutbu bắt đầu và hoàn thành đánh máy trong khi tôi tạo ra các ví dụ tích cực và tiêu cực và thêm một số tài liệu tham khảo liên kết. [I E. Tôi đã không sao chép bài tập về nhà của mình ;-)] – Johnsyweb

5
{"foo","bar","baz"}.issubset(dct.keys()) 

Đối với python < 2.7, bạn sẽ phải thay thế các thiết lập theo nghĩa đen với set(["foo","bar","baz"])

Nếu bạn thích các nhà khai thác và không nhớ hiệu suất của việc tạo ra bộ khác, bạn có thể sử dụng toán tử <= trên tập hợp và keyset của dict.

Cả hai biến thể kết hợp sẽ trông như thế:

set(["foo","bar","baz"]) <= set(dct) 

Cuối cùng, nếu bạn sử dụng python 3, dict.keys() sẽ trả về một đối tượng setlike, có nghĩa là bạn có thể gọi tổng đài mà không bị phạt hiệu suất như thế này:

{"foo","bar","baz"} <= dct.keys() 
+0

Đây là một thay thế gọn gàng, và chứng minh IMHO rằng TIMTOWTDI là không thể tránh khỏi; thật không may, 'set' in <= 2.6 không lấy' * args' - bạn cần truyền một chuỗi một cách rõ ràng (một bộ ngoặc vuông khác). –

+1

Đây sẽ là O (n) thay vì O (1) cho những người khác. Bạn thậm chí không cần phải là người Hà Lan để xem điều này thật khủng khiếp như thế nào nếu dict là rất lớn. – geoffspear

+0

Cảm ơn lỗi trong lời gọi hàm khởi tạo và đề cập đến toán tử. Tôi không nghĩ rằng O (n) đau trong trường hợp của OP, mặc dù, kể từ khi anh ta đi từ kiểm tra thủ công mỗi phím :) –