2012-05-31 22 views
5

Aşağıda gösterilen sözlüklerde, aa'daki anahtarın, bb'deki anahtarla eşleşip eşleşmediğini ve buna karşılık gelen değerin bb ile eşleşip eşleşmediğini kontrol etmek istiyorum. Yazmanın daha iyi bir yolu var mı? Bu kodpython sözlüğü, iki sözlükte anahtar değerlerle eşleşiyor

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

istediğiniz sonucu nedir kullanabilirim? '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' * * * '* That all * * * * * * * * * * matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching matching '' '' '' '' '' '' '' '' '' '' '' '' '' matching matching matching Veya anahtar başına bir Boole değeri? Ya da "Anahtar ve değer botu aa ve bb'de eşleşiyor" yazan bazı kodlar her eşleşen anahtar/değer çifti için bir kez mi? –

+1

Hmm ... Sorunu 'aa' (ikincisi, aa.iterkeys() ') ile aynı şekilde gözden geçirdiğinizde, temel yaklaşımınız gerçekten iyi. Gerçekten ne geliştirmek istiyorsun? – SingleNegationElimination

+1

Bir şekilde herkesin Rajeev'in ilk etapta ne yapmak istediğini anladığı izlenimi uyandırıyor. Yine de tamamen farklı şeylerin cevapları… –

cevap

15

Kullanım tüm eşdeğerleri bulmak için ayarlar:

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

& operatör sizi buraya intersection of both sets verir; alternatif yazabiliriz: Bu, bu en iyi yaklaşım olmayabilir çok büyük eğer öyleyse bu, hem dicts tam kopyalarını oluşturmak olmadığını

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

Not.

bir kısayol yalnızca tuşları test etmek olacaktır: Her bellek ayak izi azaltmak için dict ait Burada

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

sadece anahtarlarını kopyalayın.

Python 2.7 kullanılarak

, dict tipi doğrudan gerekli kümeleri oluşturmak için additional methods içerir:

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

Bunlar teknik olarak dictionary views ama bu sorunun amacıyla aynı davranırlar.

+0

'&' eşittir 've' – Rajeev

+2

@Rajeev: Hayır değil! '&', kümeler üzerinde 'kesişme' anlamına gelen mantıksal bir operatördür. Bu bilgiyi içerecek şekilde güncellendi. –

+2

'&' bit olarak AND, mantıksal AND değil. Ama gerçekten önemli değil çünkü setler için aşırı yüklü. –

5

Bu all ile tek astar olarak yazılabilir:

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

Daha bildirim yaklaşım niyet daha iyi iletmek olabilir ayrıca bu.

2

Eğer tüm eşleşen anahtar/değer çiftlerini üzerinde yineleme yapmak istiyorsanız,

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

(Python 2.7)

İlgili konular