2010-03-09 26 views
181

निम्नलिखित प्राप्त करने के लिए पाइथोनिक दृष्टिकोण क्या है?सूचियों की सूची में सूचियों को कैसे मर्ज करें?

# Original lists: 

list_a = [1, 2, 3, 4] 
list_b = [5, 6, 7, 8] 

# List of tuples from 'list_a' and 'list_b': 

list_c = [(1,5), (2,6), (3,7), (4,8)] 

list_c के प्रत्येक सदस्य को एक टपल, जिनकी पहली सदस्य list_a से है और दूसरा list_b से है।

उत्तर

258
>>> list_a = [1, 2, 3, 4] 
>>> list_b = [5, 6, 7, 8] 
>>> zip(list_a, list_b) 
[(1, 5), (2, 6), (3, 7), (4, 8)] 
+56

करना । 'itertools' मॉड्यूल एक 'zip_longest()' विधि को परिभाषित करता है जो कि सबसे लंबी सूची के अंत में बंद हो जाता है, जो आप पैरामीटर के रूप में प्रदान की जाने वाली किसी चीज़ के साथ गुम मूल्यों को भरते हैं। –

+5

@ एड्रियन: आपकी लागू टिप्पणी के लिए चीयर्स। पायथन 2.x के लिए, 's/zip_longest()/izip_longest()'। पायथन 3.x में 'zip_longest() 'में नामित। – bernie

+0

क्या मैं ज़िप आदेश का उपयोग कर [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6), इतने पर] बना सकता हूं? –

87

पायथन 3.0 ज़िप में एक ज़िप ऑब्जेक्ट देता है। आप list(zip(a, b)) पर कॉल करके इसकी एक सूची प्राप्त कर सकते हैं।

3

मुझे पता है कि यह एक पुराना सवाल है और पहले ही इसका उत्तर दिया गया था, लेकिन किसी कारण से, मैं अभी भी इस वैकल्पिक समाधान को पोस्ट करना चाहता हूं। मुझे पता है कि यह पता लगाना आसान है कि अंतर्निहित फ़ंक्शन आपको "जादू" की ज़रूरत है, लेकिन यह जानकर आपको चोट नहीं पहुंची है कि आप इसे स्वयं कर सकते हैं।

>>> list_1 = ['Ace', 'King'] 
>>> list_2 = ['Spades', 'Clubs', 'Diamonds'] 
>>> deck = [] 
>>> for i in range(max((len(list_1),len(list_2)))): 
     while True: 
      try: 
       card = (list_1[i],list_2[i]) 
      except IndexError: 
       if len(list_1)>len(list_2): 
        list_2.append('') 
        card = (list_1[i],list_2[i]) 
       elif len(list_1)<len(list_2): 
        list_1.append('') 
        card = (list_1[i], list_2[i]) 
       continue 
      deck.append(card) 
      break 
>>> 
>>> #and the result should be: 
>>> print deck 
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')] 
+2

इनपुट सूचियों में से एक को बदलना (यदि वे लंबाई में भिन्न हैं) एक अच्छा दुष्प्रभाव नहीं है। साथ ही, 'if-elif' में' कार्ड' के लिए दो असाइनमेंट की आवश्यकता नहीं है, यही कारण है कि आपके पास 'जारी रखें' है। (वास्तव में, 'जारी रखने' के बिना आपको सूचियों को बदलना नहीं होगा: पहले उल्लिखित असाइनमेंट दोनों को रखा जाना चाहिए और 'कार्ड = (list_1 [i],' ')' और 'card = ('', सूची_2 [1]) क्रमशः। –

6

आप मानचित्र लैम्ब्डा

a = [2,3,4] 
b = [5,6,7] 
c = map(lambda x,y:(x,y),a,b) 

इस का उपयोग भी काम करेंगे कर सकते हैं वहाँ मूल सूचियों में से लंबाई अगर

+1

लैम्ब्डा का उपयोग क्यों करें? 'मानचित्र (कोई नहीं, ए, बी)' –

+0

कोई भी त्रुटि नहीं फेंक देगा क्योंकि यह कॉल करने योग्य नहीं है। –

+0

क्या आपने इसे आजमाया? –

4

उत्पादन जो आप समस्या बयान में पता चला है मेल नहीं खाते टपल लेकिन सूची नहीं है

list_c = [(1,5), (2,6), (3,7), (4,8)] 

जांच करने के लिए

type(list_c) 

आप list_a और list_b से बाहर टपल के रूप में परिणाम चाहते हैं को देखते हुए, आप को पता है जिप समारोह कम से कम सूची के अंत है, जो हमेशा आप क्या चाहते हैं नहीं हो सकता है पर बंद हो जाता है

tuple(zip(list_a,list_b)) 
+0

का उपयोग मेरे दृष्टिकोण से, ऐसा लगता है कि मैं जो खोज रहा हूं और दोनों (सूची और टुपल) के लिए ठीक काम करता हूं। क्योंकि जब आप ** प्रिंट ** का उपयोग करते हैं, तो आपको सही मान दिखाई देगा (अपेक्षित और @cyborg और @Lodewijk द्वारा उल्लिखित) और ** ऑब्जेक्ट ** से संबंधित कुछ भी नहीं: जैसे < 'या '<ज़िप ऑब्जेक्ट 0x000002629D204C88>'।कम से कम, ** मैप ** और ** ज़िप ** (अकेला) के बारे में समाधान मेरे लिए अपूर्ण (या बहुत जटिल) प्रतीत होता है। –

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