2010-08-05 29 views

Trả lời

20

Bạn có thể sử dụng set.issubset(...), như vậy:

>>> d = {'a': 1, 'b': 2, 'c': 3} 
>>> set(['a', 'b']).issubset(d) 
True 
>>> set(['a', 'x']).issubset(d) 
False 

Python 3 đã giới thiệu một cú pháp literal bộ đã được backported để Python 2.7, do đó, những ngày ở trên có thể được viết:

>>> d = {'a': 1, 'b': 2, 'c': 3} 
>>> {'a', 'b'}.issubset(d) 
True 
>>> {'a', 'x'}.issubset(d) 
False 
+0

set (sub_dict) .issubset (parent_dict) dường như cũng hoạt động và nó đơn giản hơn với tôi. Nhưng nhờ con trỏ :) – trojjer

20
if all(test in d for test in ('a','b','c')): 
    # do something 
1

thể sử dụng một itemgetter bọc trong một thử/trừ.

>>> from operator import itemgetter 
>>> d = dict(a=1,b=2,c=3,d=4) 
>>> e = dict(a=1,b=2,c=3,e=4) 
>>> getter=itemgetter('a','b','c','d') 
>>> getter(d) 
(1, 2, 3, 4) 
>>> getter(e) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'd' 

Nhưng thực sự tôi thích Paul McGuire của giải pháp

5

Trong Python3 bạn có thể viết

set("abc")<=d.keys() 

Trong Python2.7 bạn có thể viết

d.viewkeys()>=set("abc") 

tất nhiên nếu các phím được không phải ký tự đơn lẻ, bạn có thể thay thế set("abc") bằng set(('a', 'b', 'c'))

+0

sẽ là ngọt ngào, nhưng tôi chỉ có thể sử dụng python 2.4 trên máy chủ prod của chúng tôi. – AkaBkn

+0

+1 cho đầy đủ trong trường hợp ai đó sau này đang tìm kiếm ở đây và đang sử dụng python 2.7+ –

1

Trong 2.4, tôi luôn sử dụng các hoạt động đã đặt cho các mục đích như vậy. Nếu nó có giá trị một cảnh báo (hoặc loại khác của msg hoặc ngoại lệ) khi một số phím mong muốn bị thiếu, đặc biệt là, tôi làm:

missing = set(d).difference(('a', 'b', 'c')) 
if missing: 
    logging.warn("Missing keys: %s", ', '.join(sorted(missing))) 
else: 
    ... 

thay thế logging.warn gọi là thích hợp, tất nhiên (có lẽ chỉ logging.info hoặc thậm chí logging.debug, có thể logging.error, có thể là một ngoại lệ).

Phần sorted phần lớn là mỹ phẩm (tôi thích thông báo lỗi đáng tin cậy, lặp lại) nhưng cũng giúp kiểm tra một chút (khi tôi giả lập logging.warn - hoặc bất kỳ điều gì - trong các bài kiểm tra, thật tuyệt vời để có thể mong đợi một chuỗi cụ thể và nếu tôi không sắp xếp các missing đặt chuỗi cảnh báo có thể khác nhau, tất nhiên, vì các bộ, giống như lệnh dicts, không có khái niệm về thứ tự).

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