क्या जिप की तरह एक फ़ंक्शन है जो पायथन में सबसे लंबी लंबाई तक पैड है?


170

क्या कोई अंतर्निहित फ़ंक्शन है जो काम करता है 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)]

जवाबों:


243

पायथन 3 में आप उपयोग कर सकते हैं itertools.zip_longest

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

आप पैरामीटर Noneका उपयोग करके किसी भिन्न मान के साथ पैड कर सकते हैं fillvalue:

>>> list(itertools.zip_longest(a, b, c, fillvalue='foo'))
[('a1', 'b1', 'c1'), ('foo', 'b2', 'c2'), ('foo', 'b3', 'foo')]

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

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

3
क्या हमारे पास नॉन इटर्टूलस पायथन 3 सॉल्यूशन नहीं है?
पास्कलवीकूटेन

3
@PascalvKooten इसकी आवश्यकता नहीं है। itertoolsवैसे भी एक अंतर्निहित C मॉड्यूल है।
अंटी हापला

82

पायथन 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)]

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

5

गैर पुनरावृत्ति पायथन 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)

2

नॉन इटर्टूलस माय पायथन 2 समाधान:

if len(list1) < len(list2):
    list1.extend([None] * (len(list2) - len(list1)))
else:
    list2.extend([None] * (len(list1) - len(list2)))

0

Im एक 2d सरणी का उपयोग कर रहा है, लेकिन अवधारणा अजगर 2.x का उपयोग करने के समान है:

if len(set([len(p) for p in printer])) > 1:
    printer = [column+['']*(max([len(p) for p in printer])-len(column)) for column in printer]

2
कृपया स्पष्टीकरण दें कि यह कोड क्यों काम करता है। या यह सही उत्तर क्यों है
सूट बॉय ऐप्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.