2013-02-16 16 views
7

मैं एक ही लंबाईअजगर में, यह <code>n = 2</code> हो जाएगा दो क्रमित सूचियों

a = [1, 3, 5, 7, 9] 
b = [1, 2, 5, 7, 3] 

की दो सूचियां तुलना और मतभेद n की संख्या का पता लगाने के, इस मामले में करना चाहते हैं के बीच मतभेद की संख्या का पता लगाने, और लम्बाई बराबर नहीं होने पर भी एक त्रुटि लौटाएं। ऐसा करने का पाइथोनिक तरीका क्या है?

उत्तर

16

यह करने के लिए सबसे आसान तरीका the sum() built-in उपयोग करने के लिए है और एक generator expression:

def differences(a, b): 
    if len(a) != len(b): 
     raise ValueError("Lists of different length.") 
    return sum(i != j for i, j in zip(a, b)) 

हम सूचियों से अधिक पाश एक साथ zip() का उपयोग कर और फिर उन्हें तुलना करें। True == 1 और False == 0 के रूप में, हम अंतरों की संख्या प्राप्त करने के लिए बस इसे जोड़ते हैं।

sum(1 for i, j in zip(a, b) if i != j) 

मैं वास्तव में यह नहीं कह सकते मुझे लगता है एक दूसरे से अधिक पठनीय है, और संदेह एक प्रदर्शन अंतर नहीं होगा: एक अन्य विकल्प जनरेटर अभिव्यक्ति की सशर्त भाग का उपयोग करना होगा।

+0

मैं मैं के लिए स्पष्ट '1 पसंद करते हैं देता मिलता है इस बूलियन सूची के समारोह योग() ', निहित बूलियन के बजाय (इसे 'int' होने पर निर्भर करता है), लेकिन फिर भी +1 (जब तक यह लंबाई की जांच स्पष्ट हो) –

+0

@ जोन क्लेमेंट्स मैं सहमत हूं, और फिर भी महत्वपूर्ण हिस्सा (तुलना) को धक्का दिया जाता है अभिव्यक्ति का अंत, जो अजीब लगता है। मैं अपने दिमाग को बदलता रहता हूं जिसके लिए मैं पसंद करता हूं। –

-1

आप sets का उपयोग कर सकते हैं। दोनों को एक सेट में कास्ट करें, फिर दोनों के बीच अंतर खोजें। उदाहरण के लिए:

>>> a = [1,3,5,7,9] 
>>> b = [1,2,5,7,2] 
>>> len(set(a) - set(b)) 
2 

इसे पहले फंक्शन में अंतर के लिए एक फ़ंक्शन में लपेटा जा सकता है।

+2

यदि दोहराए गए तत्व हैं तो यह काम नहीं करेगा, और खाते में आदेश नहीं लेता है। 'अंतर ([1, 3, 5, 7, 9], [9, 7, 5, 3, 1])' ''' के विपरीत '0' होगा। ओपी का उदाहरण अलग-अलग होने के बावजूद '3' की गणना करता है, इसके बावजूद दोनों सूचियों में मौजूद है (यानी, स्थिति महत्वपूर्ण है)। यह सूचियों की अलग-अलग लंबाई की संभावना को भी अनदेखा करता है, जैसा कि सवाल में बताया गया था। –

+0

आह हाँ, मैंने पिछले 3 को याद किया, और मेरे उदाहरण में 2 का उपयोग किया था। मेरी गलती! मैंने बताया कि आपके उदाहरण कोड के अनुसार मतभेदों की जांच के लिए एक फ़ंक्शन का उपयोग किया जा सकता है। – user2079098

1

एक-लाइनर समाधान अगर लंबाई बराबर नहीं है कि यह भी एक त्रुटि पैदा करता है:

>>> sum(map(lambda x,y: bool(x-y),[1,2],[1])) 
TypeError 

यह कैसे काम करता:

>>> sum(map(lambda x,y: bool(x-y),a,b)) 
2 

अब अलग अलग लंबाई के इनपुट की कोशिश bool (एक्स, वाई) यदि तत्व अलग हैं तो सत्य लौटाता है। फिर हम इस फ़ंक्शन को 2 सूचियों पर मैप करते हैं और सूची प्राप्त करते हैं [गलत, सही, गलत, सही, गलत]।
अगर हम() फ़ंक्शन नक्शे में अलग अलग लंबाई की सूची में डाल दिया है, हम लेखन त्रुटि

अंत में, 2.

+0

ध्यान दें कि 'नक्शा() 'और' लैम्ब्डा 'आम तौर पर सूची कंप/जेनरेटर अभिव्यक्ति की तुलना में धीमे और कम पठनीय होते हैं, और यह केवल संख्याओं के लिए काम करेगा। –

+0

हां, वे धीमे हैं, लेकिन कोड बहुत छोटा है, यह आवश्यकतानुसार निर्भर करता है (अतिरंजित, गति की आवश्यकता में, अजगर का उपयोग न करें :))। अधिक पठनीय क्या है एक बहुत ही व्यक्तिपरक मामला है। आप सही हैं कि यह उन प्रकारों पर काम नहीं करता है जहां ऑपरेशन परिभाषित नहीं किया गया है। –

+0

एक और समाधान के लिए धन्यवाद।मैं @ लैटवेयर के समाधान को प्राथमिकता देता हूं क्योंकि व्यक्तिगत रूप से मुझे लगता है कि यह अधिक पठनीय है। मैं 'लैम्ब्डा' समारोह से परिचित नहीं हूं। इसके समाधान के साथ मैं त्रुटि संदेश को परिभाषित कर सकता हूं, इसलिए मुझे पता है कि मुझे क्या त्रुटि मिली। – LWZ