2012-04-22 9 views
6

मुझे एक शब्दकोश में चाबियों के सेट को खोजने के लिए 2 शब्दकोशों की तुलना करने की आवश्यकता है जो दूसरे में नहीं था।2 शब्दकोशों के बीच "कुंजी" अंतर खोजने के लिए संक्षिप्त तरीका?

मैं जानता हूँ कि अजगर सेट कि वस्तुओं का समर्थन:

set3=set1-set2 

लेकिन मैं ऐसा नहीं कर सकते:

dict3=dict1-dict2 

या:

missingKeys=dict1.keys()-dict2.keys() 

(मैं एक छोटे से हैरान था आखिरी बिंदु से, क्योंकि जावा में कुंजी एक सेट ऑब्जेक्ट हैं।) एक समाधान है:

missingKeys=set(dict1.keys())-set(dict2.keys()) 

क्या ऐसा करने के लिए एक बेहतर या अधिक संक्षिप्त तरीका है?

+0

मुझे लगता है कि अंतिम पंक्ति पर्याप्त अपने आप को संक्षिप्त है, लेकिन ... मैं एक और अधिक दिलचस्प सवाल लगता है "एक्स से वाई में सभी जेड को कैसे हटाया जाए?" जहां एक्स और वाई सूचियां हैं। यह उपयोगी होगा जहां एक्स में डुप्लिकेट जेड मौजूद है जो वाई में दिखाई देता है, उदाहरण के लिए अकेला छोड़ा जाना चाहिए। –

+0

@pst: ठीक है, यह सेट ऑब्जेक्ट्स बनाने के लिए थोड़ा अजीब लगता है, केवल अंतर() फ़ंक्शन का लाभ उठाने के लिए ... –

+0

दूसरी ओर, क्योंकि यह * एक सेट है, यह एक बेहतर ओ का लाभ उठा सकता है ... समझ के उपयोग से सूची मतभेदों के लिए आसान है, लेकिन एक और अधिक शब्दशः। फिर भी वही प्रदर्शन अगर "जांच" सूची को 'सेट' में परिवर्तित कर दिया गया है, हालांकि। –

उत्तर

3

शायद

[x for x in dict1.keys() if x not in dict2.keys()] 
+2

मुझे लगता है कि यह थोड़ा और संक्षिप्त हो सकता है: '[x के लिए x1 dict1.keys() x x में dict2 में नहीं है] क्योंकि 'x में dict.keys()' 'x में' x 'जैसा ही है – mgilson

+0

@ मिगिलसन: जब तक आपने 'x in dict'' को इंगित किया है, तब तक 'x में dict.keys()' के समान है, तो पूर्ण कमी 'x के लिए x के लिए x है यदि x dict2 में x नहीं है]। –

+1

@ सैमगोल्डबर्ग आप सही हैं।कारण मैंने इसके बारे में नहीं सोचा क्योंकि 'x में dict के लिए' एक dict पर '__iter__' विधि को कॉल करता है जबकि' यदि x in dict 'में '__contains__' विधि को कॉल किया जाता है। इसलिए, इस मामले में, 'इन' दो अलग-अलग चीजें करता है - वे एक ही परिणाम होने के लिए होते हैं। वैसे भी: '[x के लिए x1 में x1 यदि x dict2 में x नहीं है]' जैसा कि आपने बताया है, सबसे संक्षिप्त है। – mgilson

15

अजगर 2.7:

>>> d = {1:2, 2:3, 3:4} 
>>> d2 = {2:20, 3:30} 
>>> set(d)-set(d2) 
set([1]) 

अजगर 3.2:

>>> d = {1:2, 2:3, 3:4} 
>>> d2 = {2:20, 3:30} 
>>> d.keys()-d2.keys() 
{1} 
+0

+1 ओह, स्नीकी पायथन 3.x! –

+0

तो आप कह रहे हैं कि पायथन 3.2 dict.keys() विधि एक सेट (जावा की तरह) देता है? किसी भी कारण से पहले संस्करण ने ऐसा क्यों नहीं किया? –

+2

@ सैमगोल्डबर्ग: नहीं, यह वास्तव में एक dict_keys ऑब्जेक्ट देता है, सेट नहीं, लेकिन इसमें कई सेट-जैसे ऑपरेशन हैं। देखें, उदा। [यह सवाल] (http://stackoverflow.com/questions/7296716/what-is-dict-keys-dict-items-and-dict-values)। – DSM

4

मैं अजगर 2.7 में dict.viewkeys का उपयोग कर सुझाव है कि यह ऐसा करने का पोर्टेबल रास्ते के लिए - यह पायथन 3.x dict.keys का बैकपोर्ट है और स्वचालित रूप से 2to3 द्वारा परिवर्तित किया जाता है।

उदाहरण:

>>> left = {1: 2, 2: 3, 3: 4} 
>>> right = {2: 20, 3:30} 
>>> left.viewkeys() - right.viewkeys() 
set([1]) 
1

यह अजगर 2.7 में काम करना चाहिए और 3.x:

>>> keys = getattr(dict, 'viewkeys', dict.keys) 
>>> left = {1: 2, 2: 3, 3: 4} 
>>> right = {2: 20, 3:30} 
>>> list(keys(left) - keys(right)) 
[1] 
संबंधित मुद्दे