2011-09-26 16 views
94

संभव डुप्लिकेट:दो सूचियों में जोड़ों की सूची/टपल अनपैक/tuples

मैं:
A Transpose/Unzip Function in Python

मैं एक सूची है कि इस तरह दिखता है सूची को 2 सूचियों में अलग करना चाहते हैं।

list1 = ('1','2','3','4') 
list2 = ('a','b','c','d') 

मैं के साथ उदाहरण के लिए यह कर सकते हैं:

list1 = [] 
list2 = [] 
for i in list: 
    list1.append(i[0]) 
    list2.append(i[1]) 

लेकिन मैं अगर वहाँ एक और अधिक सुरुचिपूर्ण समाधान है जानना चाहते हैं।

+7

कृपया चर के लिए अंतर्निहित प्रकार के नामों का उपयोग न करें। इसे 'सूची' मत कहो। एक बार जब आप एक चर 'सूची' बना लेते हैं, तो आपको अजीब चीजें होती हैं क्योंकि अंतर्निहित फ़ंक्शन 'सूची() 'अब आपके चर से छिपी हुई है। –

+2

यह एक टुपल है, सूची नहीं। उन्हें सीधे पायथन में रखना महत्वपूर्ण है, भले ही उन्हें समान रूप से उपयोग किया जा सके। –

उत्तर

183
>>> source_list = ('1','a'),('2','b'),('3','c'),('4','d') 
>>> list1, list2 = zip(*source_list) 
>>> list1 
('1', '2', '3', '4') 
>>> list2 
('a', 'b', 'c', 'd') 

संपादित करें: ध्यान दें कि zip(*iterable) अपनी ही उल्टा होता है:

>>> list(source_list) == zip(*zip(*source_list)) 
True 

जब दो सूचियों में खोल, इस हो जाता है:

>>> list1, list2 = zip(*source_list) 
>>> list(source_list) == zip(list1, list2) 
True 

अलावा rocksportrocker ने सुझाव दिया।

+5

ओपी को, http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python उपयोगी है अगर आपको "splat" ऑपरेटर के बारे में पता नहीं है। – dicato

+5

मैं यह इंगित करना चाहता हूं कि 'ज़िप (* list_of_pairs)' के परिणाम 'सूची' की एक जोड़ी नहीं है लेकिन' tuple' है। कुछ मामलों में अंतर महत्वपूर्ण हो सकता है (उदा। इसमें शामिल)। तो उदाहरण में 'list1' और' list2' वास्तव में 'tuple1' और' tuple2' होना चाहिए। – Causality

+0

@ कौशलिटी निश्चित रूप से सच है। मैंने प्रश्न में इस्तेमाल किए गए समान नामों का इस्तेमाल किया, जहां वे भी 'tuple's' हैं। गलती को प्रश्न पर एक टिप्पणी में बताया गया था जब इसे मूल रूप से पोस्ट किया गया था: http://stackoverflow.com/questions/7558908/unpacking-a-list-tuple-of-pairs-into-two-lists-tuples/ 7558 9 0 9? Noredirect = 1 # comment9163175_7558908 – agf

17
list1= (x[0] for x in source_list) 
list2= (x[1] for x in source_list) 
+2

यदि आपको वास्तविक 'सूची' की आवश्यकता है, तो आप इंडेक्स कर सकते हैं, आपको जेनरेटर एक्सप्रेशन के बजाय सूची समझने के लिए ब्रांड्स के बजाय स्क्वायर ब्रैकेट '[]' का उपयोग करना चाहिए। – agf

+0

-1, ज़िप() के साथ समाधान अधिक पाइथनिक है और इसमें दो के लिए दो नहीं हैं – naeg

+7

@naeg, यह एक बिल्कुल सही, पायथनिक अभिव्यक्ति है। आप कम प्रशिक्षित प्रोग्रामर के लिए भी बहस कर सकते हैं यह काफी धुंधला 'ज़िप (* ...)' वाक्यविन्यास का उपयोग करने से बेहतर समाधान है। – KillianDS

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