ट्यूल की सूची में सूची को कैसे मर्ज किया जाए?


297

निम्नलिखित को प्राप्त करने के लिए पायथोनिक दृष्टिकोण क्या है?

# 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

जवाबों:


442

पायथन 2 में:

>>> 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)]

पायथन 3 में:

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

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

5
@ एड्रियन: आपकी लागू टिप्पणी के लिए खुश है। पायथन के लिए 2.x s/zip_longest()/izip_longest(),। जिसका नाम पाइथन 3.x में रखा गया है zip_longest()
मैकेनिकल_मीट

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

3
@ मोनालाल: नहीं, यह जोड़ी नहीं है, जो सूचियों का उत्पाद बना रहा है। itertools.product()क्या वो।
मार्टिन पीटर्स

2
ध्यान दें, कम से कम python3.6 ज़िप में सूची वापस नहीं आती है। तो आपको इसके बजाय सूची (ज़िप (list_a, list_b)) की आवश्यकता है
Supamee

141

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


3
यह तुच्छ हो सकता है, लेकिन चेतावनी दी जा सकती है कि इसे सीधे लूप में उपयोग करने से आपको एक जनरेटर मिलता है जो एक बार उपयोग करने के बाद समाप्त हो जाएगा। एक चर में सहेजें यदि आप इसे अधिक बार उपयोग करना चाहते हैं
Hakaishin

13

आप मैप लैम्ब्डा का उपयोग कर सकते हैं

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

यह भी काम करेगा यदि मूल सूचियों की लंबाई मेल नहीं खाती है


1
एक मेमने का उपयोग क्यों करें? map(None, a,b)
पादरिक कनिंघम

मेरे पास केवल अजगर 3.5 तक पहुंच है।
डार्क नाइट

3
यदि आप python3 का उपयोग कर रहे थे तो c एक सूची नहीं होगी यह एक मानचित्र वस्तु होगी, एक लैम्ब्डा का उपयोग करना भी सिर्फ ज़िपिंग की तुलना में बहुत कम कुशल होने वाला है, यदि आपके पास अलग-अलग लंबाई की सूची है और इसे संभालना चाहते हैं तो आप उपयोग करेंगे izip_longest / zip_longest
कनिंघम


6

मुझे यकीन नहीं है कि यह एक पाइथोनिक तरीका है या नहीं लेकिन यह आसान लगता है अगर दोनों सूचियों में समान तत्वों की संख्या हो:

list_a = [1, 2, 3, 4]

list_b = [5, 6, 7, 8]

list_c=[(list_a[i],list_b[i]) for i in range(0,len(list_a))]

5

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

>>> 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
इनपुट सूचियों में से एक को बदलना (यदि वे लंबाई में भिन्न हैं) एक अच्छा साइड-इफेक्ट नहीं है। इसके अलावा, दो के लिए कार्य cardमें if-elifआवश्यक नहीं हैं, है यही कारण है कि तुम हो continue। (वास्तव में, बिना continue: दोनों जैसा कि पहले उल्लेख कार्य तो रखा जाना चाहिए और हो जाते हैं आप सूचियों परिवर्तन होगा नहीं card = (list_1[i], '')और card = ('', list_2[1])क्रमशः।)
ᴠɪɴᴄᴇɴᴛ

5

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

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

के लिए जाँचे

type(list_c)

यह विचार करते हुए कि आप सूची से बाहर ट्यूपल के रूप में परिणाम चाहते हैं और list_b, करते हैं

tuple(zip(list_a,list_b)) 

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

1
प्रश्न में कहा गया है कि वे टुपल्स की सूची चाहते हैं न कि ट्यूपल्स की ट्यूपल।
गोरख

1

उपयोग किए बिना एक विकल्प zip:

list_c = [(p1, p2) for idx1, p1 in enumerate(list_a) for idx2, p2 in enumerate(list_b) if idx1==idx2]

यदि कोई न केवल 1 के साथ 1, 2 के साथ 2 के साथ ट्यूपल्स प्राप्त करना चाहता है ... लेकिन 2 सूचियों के सभी संभावित संयोजन, जो के साथ किया जाएगा

list_d = [(p1, p2) for p1 in list_a for p2 in list_b]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.