2009-08-14 9 views
104

वहाँ एक अंतर्निहित समारोह है कि zip() तरह काम करता है, लेकिन यह इच्छा पैड परिणाम है ताकि उसके एवज में सूची की लंबाई नहीं बल्कि कम से कम इनपुट से सबसे लंबे समय तक इनपुट की लंबाई है?पायथन: ज़िप-जैसी फ़ंक्शन जो सबसे लंबी लंबाई तक पैड करता है?

>>> a=['a1'] 
>>> b=['b1','b2','b3'] 
>>> c=['c1','c2'] 

>>> zip(a,b,c) 
[('a1', 'b1', 'c1')] 

>>> What command goes here? 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+0

'itertools' ** है ** एक अंतर्निहित, यहां तक ​​कि एक मॉड्यूल में हालांकि। –

उत्तर

137

आप उपयोग कर सकते हैं या तो itertools.izip_longest (अजगर 2.6+), या आप None साथ map उपयोग कर सकते हैं। यह थोड़ा ज्ञात feature of map है (लेकिन map पायथन 3.x में बदल गया है, इसलिए यह केवल पायथन 2.x में काम करता है)।

>>> map(None, a, b, c) 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+2

@ सिलेंटगोस्ट, मैंने आपका शब्द लिया कि यह py3k में काम नहीं करता है। मेरे पास पुष्टि करने के लिए py3k नहीं है। –

+1

'>>> सूची (मानचित्र (कोई नहीं, क, ख, ग)) Traceback (सबसे हाल कॉल पिछले): फ़ाइल" ", लाइन 1, सूची (मानचित्र (कोई नहीं, एक, ख, ग में)) टाइप एरर: 'कोई नहीं टाइप' ऑब्जेक्ट कॉल करने योग्य नहीं है ' – SilentGhost

+0

आप दस्तावेज़ों से परामर्श भी ले सकते हैं: http://docs.python.org/3.1/library/functions.html#map – SilentGhost

74
अजगर 2.6x उपयोग itertools मॉड्यूल के izip_longest लिए

पाइथन 3 के लिए zip_longest का उपयोग करें (कोई अग्रणी i)।

>>> list(itertools.izip_longest(a, b, c)) 
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+7

यदि आप अपना कोड दोनों पायथन 2 और पायथन 3 संगत बनाना चाहते हैं, तो आप इसके बजाय 'six.moves.zip_longest' का उपयोग कर सकते हैं। – Gamrix

2

गैर itertools अजगर 3 समाधान:

def zip_longest(*lists): 
    def g(l): 
     for item in l: 
      yield item 
     while True: 
      yield None 
    gens = [g(l) for l in lists]  
    for _ in range(max(map(len, lists))): 
     yield tuple(next(g) for g in gens) 
संबंधित मुद्दे