2012-06-26 47 views
13

Có phương pháp đơn dòng nào để kiểm tra xem một dict Python 2d có khóa/giá trị bên trong không?Dòng đơn mã để kiểm tra khóa trong từ điển bên trong lồng nhau 2D

Ngay bây giờ tôi somethng như thế này:

if d.has_key(k1): 
    if d[k1].has_key(k2): 
     # do something 

Có cách nào tốt hơn để làm điều này?

Cảm ơn

+3

_Trợ yêu cầu tha thứ hơn permission_ là thành ngữ Python. Bạn có thể sử dụng try/except. –

Trả lời

21
if k2 in d.get(k1, {}): 
    # do something 

Đoạn trên là tốt đẹp nếu bạn không quan tâm về việc liệu k1 thực sự tồn tại hay không và chỉ muốn biết liệu k2 tồn tại bên trong của nó nếu nó tồn tại. Như bạn có thể nhìn thấy từ đoạn mã của tôi, tôi thích các nhà điều hành in, nhưng bạn có thể chỉ là một cách dễ dàng nói

if d.get(k1, {}).has_key(k2): 
    # do something 

nếu bạn thích thành ngữ đó, nhưng phương pháp has_key đã bị phản đối bằng Python 3.x, vì vậy bạn có lẽ nên tránh nó.

+0

+1 cho toán tử 'in' – bpgergo

4
if d.has_key(k1) and d[k1].has_key(k2): 
+4

Phương thức 'has_key()' đã không được dùng trong python 3.x –

12

Bạn có thể sử dụng in:

if k1 in d and k2 in d[k1]: 

Phương pháp has_key bị phản đối và được lấy ra bằng Python 3.x.

liên quan:

+0

+1 cho 'has_key()' hoặc 'in'? – bpgergo

1

Không sử dụng has_key() sử dụng get() như has_key() đã bị phản đối python 3.x:

d.get(k1,None) and d[k1].get(k2,None): 
2

Câu trả lời cho câu hỏi đầu tiên của bạn là có. Tôi xem xét câu trả lời của Eli

if k2 in d.get(k1, {}): 

lớp lót tốt nhất vì nó tránh tìm kiếm k1 trong d hai lần. Câu trả lời cho câu hỏi thứ hai của bạn phụ thuộc vào những gì bạn muốn làm nếu một trong hai thử nghiệm thất bại và nếu bạn muốn làm một cái gì đó khác nhau trong hai trường hợp thất bại. Nếu vậy:

try: 
    d1 = d[k1] 
    if k2 in d1: 
     <both tests passed> 
    else: 
     <second test failed> 
except KeyError: 
    <first test failed> 
6

Tôi không có đủ danh tiếng để nhận xét, nhưng xin lưu ý rằng đề xuất hàng đầu sẽ thất bại nếu giá trị của key1 là Không.

if k2 in d.get(k1, {}): 
    # do something 

không thành công nếu d = {'k1': None} để đảm bảo giá trị khóa của bạn.

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