2012-05-31 44 views
5

Trong các từ điển được hiển thị dưới đây, tôi muốn kiểm tra xem khóa trong aa có khớp với khóa trong bb hay không và giá trị tương ứng với khóa đó trong bb hay không. mã nàyTừ điển python phù hợp với các giá trị khóa trong hai từ điển

aa = {'a': 1, 'c': 3, 'b': 2} 
    bb = {'a': 1, 'b': 2} 

    for k in aa: 
    if k in bb: 
     if aa[k] == bb[k]: 
     print "Key and value bot matches in aa and bb" 
+0

kết quả mong muốn của bạn là gì? Bạn có muốn một giá trị Boolean duy nhất cho biết các phím * all * trong 'aa' cũng xuất hiện trong' bb' có giá trị khớp không? Hoặc một giá trị Boolean cho mỗi khóa? Hoặc một số mã in '' Khoá và giá trị bot khớp với aa và bb "' một lần cho mỗi cặp khóa/giá trị khớp nhau? –

+1

Hmm ... Xem xét vấn đề với cách bạn lặp lại trên 'aa' (gợi ý, nó giống như' aa.iterkeys() '), cách tiếp cận cơ bản của bạn thực sự là tốt. Bạn thực sự muốn cải thiện điều gì? – SingleNegationElimination

+1

Tôi bằng cách nào đó có ấn tượng rằng mọi người khác dường như hiểu những gì Rajeev muốn làm ngay từ đầu. Tuy nhiên, câu trả lời cho những điều hoàn toàn khác nhau… –

Trả lời

15

Sử dụng bộ để tìm tất cả các khoản tương đương:

for (key, value) in set(aa.items()) & set(bb.items()): 
    print '%s: %s is present in both aa and bb' % (key, value) 

Nhà điều hành & đây mang đến cho bạn intersection of both sets; cách khác, bạn có thể viết:

set(aa.items()).intersection(set(bb.items())) 

Lưu ý rằng điều này tạo ra bản sao đầy đủ của cả hai dấu gạch ngang vì vậy nếu chúng rất lớn, đây có thể không phải là cách tiếp cận tốt nhất.

Một shortcut sẽ chỉ kiểm tra các phím:

for key in set(aa) & set(bb): 
    if aa[key] == bb[key]: 
     print '%s: %s is present in both aa and bb' % (key, value) 

Ở đây bạn chỉ sao chép các phím của mỗi dict để giảm bộ nhớ.

Khi sử dụng Python 2.7, loại dict bao gồm additional methods để tạo ra các bộ yêu cầu trực tiếp:

for (key, value) in aa.viewitems() & bb.viewitems(): 
    print '%s: %s is present in both aa and bb' % (key, value) 

Đây là những kỹ thuật dictionary views nhưng đối với mục đích của vấn đề này họ hành động như vậy.

+0

là '&' bằng 'và' – Rajeev

+2

@Rajeev: Không phải vậy! '&' là toán tử logic, mà trên các tập hợp có nghĩa là 'giao nhau của'. Đã cập nhật câu trả lời để bao gồm thông tin đó. –

+2

'&' là bitwise AND, không logic AND. Nhưng nó không thực sự quan trọng, bởi vì nó quá tải cho các bộ. –

5

này có thể được viết như một lớp lót với all:

all(bb[k] == v for k, v in aa.iteritems() if k in bb) 

Nó cũng tiếp cận declarative hơn, mà có thể truyền đạt ý định tốt hơn.

2

Nếu bạn muốn để lặp qua tất cả các cặp khóa/giá trị phù hợp, bạn có thể sử dụng

for key, value in aa.viewitems() & bb.viewitems(): 
    ... 

(Python 2.7)

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