2012-06-12 35 views
50

Tôi có một cuốn từ điển đó trông như thế:séc Python nếu danh sách các phím tồn tại trong từ điển

grades = { 
     'alex' : 11, 
     'bob' : 10, 
     'john' : 14, 
     'peter': 7 
     } 

và một danh sách tên students = ('alex', 'john')

Tôi cần phải kiểm tra xem tất cả các tên trong students tồn tại như các phím trong số grades dict.

grades có thể có tên hơn, nhưng tất cả các tên trong students phải ở trong grades

Phải có một cách đơn giản để làm điều đó, nhưng tôi vẫn còn mới đến python và không thể tìm nó ra. đã thử if students in grades, không hoạt động.

Trong trường hợp thực tế, danh sách sẽ lớn hơn nhiều.

+0

Bản sao có thể có của [Làm cách nào để kiểm tra xem nhiều khóa có ở dạng dict trong một lần truyền không?] (Https://stackoverflow.com/questions/1285911/how-do-i-check-that-multiple-keys -are-in-a-dict-in-a-single-pass) –

Trả lời

107

Sử dụng all():

if all(name in grades for name in students): 
    # whatever 
+25

@chaft: Ngay cả mã ví dụ [phải chính xác] (http://sscce.org/#co). –

+1

@SvenMarnach: Nếu tôi có thể bình chọn bình luận của bạn nhiều lần, tôi sẽ làm như vậy. – MattH

+0

Tuyệt vời! Bất kỳ cách tắt nào để lấy các phần tử bị thiếu trong dic nếu điều kiện là False? – guival

17
>>> grades = { 
     'alex' : 11, 
     'bob' : 10, 
     'john' : 14, 
     'peter': 7 
} 
>>> names = ('alex', 'john') 
>>> set(names).issubset(grades) 
True 
>>> names = ('ben', 'tom') 
>>> set(names).issubset(grades) 
False 

Gọi nó class là không hợp lệ vì vậy tôi đã thay đổi nó để names.

+0

Điều này không thể cắt ngắn, trái ngược với 'all()'. Nó sẽ luôn luôn là O (m + n), trong đó m và n là các kích thước tương ứng của 'tên' và' lớp'. Sử dụng 'all()' sẽ là O (m), và có thể cắt ngắn. –

+3

@SvenMarnach Phải, tôi sẽ để nó ở đây vì nó là một cách tiếp cận khác nhưng tôi đồng ý rằng bạn là tốt nhất. – jamylak

+0

Chắc chắn để nó ở đây! Đó là một cách tiếp cận thú vị trong mọi trường hợp. –

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