2012-05-31 16 views
5

नीचे दिखाए गए शब्दकोशों में मैं यह जांचना चाहता हूं कि aa में कुंजी बीबी में कुंजी से मेल खाती है और इसके साथ संबंधित मान बीबी में मेल खाता है या नहीं। क्या लिखने का एक बेहतर तरीका है इस कोड कोपायथन शब्दकोश दो प्रमुख शब्दकोशों में मिलान मूल्य

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

अपना इच्छित परिणाम क्या है? क्या आप एक एकल बूलियन मान चाहते हैं कि 'aa' में * सभी * कुंजी जो' बीबी' में दिखाई देती हैं, मिलान मान हैं? या प्रति एक बूलियन मूल्य? या कुछ कोड जो प्रत्येक मिलान कुंजी/मूल्य जोड़ी के लिए एक बार "कुंजी और मूल्य बॉट मैचों में एए और बीबी" प्रिंट करता है? –

+1

हम्म ... 'aa'' पर संकेत देने के तरीके के साथ इस मुद्दे को देखकर (संकेत, यह 'aa.iterkeys()' जैसा ही है), आपका मूल दृष्टिकोण वास्तव में ठीक है। आप वास्तव में क्या सुधारना चाहते हैं? – SingleNegationElimination

+1

मुझे किसी भी तरह का इंप्रेशन मिलता है कि हर कोई यह समझता है कि राजीव पहले स्थान पर क्या करना चाहता है। फिर भी पूरी तरह से अलग चीजों के जवाब ... –

उत्तर

15

उपयोग सभी समकक्ष खोजने के लिए सेट:

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

& ऑपरेटर यहाँ आप intersection of both sets देता है; वैकल्पिक रूप से आप लिख सकते हैं:

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

ध्यान दें कि यह दोनों dicts की पूर्ण प्रति पैदा नहीं करता है, इसलिए यदि इन बहुत बड़े तो आप इस का सबसे अच्छा तरीका नहीं हो सकता है कर रहे हैं।

एक शॉर्टकट केवल कुंजियों का परीक्षण करने के होगा:

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

यहाँ आप केवल कुंजी कॉपी में से प्रत्येक स्मृति पदचिह्न को कम करने के लिए dict।

अजगर 2.7 का उपयोग कर, dict प्रकार सीधे आवश्यक सेट बनाने के additional methods में शामिल हैं:

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

ये तकनीकी रूप से dictionary views हैं, लेकिन इस समस्या के प्रयोजनों के लिए वे एक ही काम करते हैं।

+0

'और' बराबर 'और' – Rajeev

+2

@ राजीव: नहीं, यह नहीं है! '&' एक तार्किक ऑपरेटर है, जो सेट पर ''का चौराहे' है। उस जानकारी को शामिल करने के लिए उत्तर अपडेट किया गया। –

+2

'और' बिटवाई है और तार्किक नहीं है और। लेकिन यह वास्तव में कोई फर्क नहीं पड़ता, क्योंकि यह सेट के लिए अधिभारित है। –

5

यह all साथ एक लाइनर के रूप में लिखा जा सकता है:

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

यह भी अधिक कथात्मक तरीका है, आशय बेहतर व्यक्त हो सकता है।

2

आप सभी मिलान कुंजी/मान जोड़े से अधिक पुनरावृति करना चाहते हैं, तो आप

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

(अजगर 2.7) का उपयोग कर सकते

संबंधित मुद्दे