পাইপ-এর মতো কোনও কার্য রয়েছে যা পাইথনের দীর্ঘতম দৈর্ঘ্যের জন্য প্যাড করে?


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(পাইথন 2.6+), অথবা আপনি ব্যবহার করতে পারেন mapসঙ্গে None। এটি এর সামান্য পরিচিত বৈশিষ্ট্যmap (তবে mapপাইথন ৩.x এ পরিবর্তিত হয়েছে, সুতরাং এটি কেবল পাইথন ২.x এ কাজ করে)।

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

3
পাইথন 3 সমাধানটি আমাদের কাছে নন?
পাসক্যালভিকুটেন

3
@ পাসকলভকুটেন এটির প্রয়োজন নেই। itertoolsযাইহোক একটি বিল্টিন সি মডিউল।
অ্যান্টি হাপাল

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)


0

আমি একটি 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
কেন এই কোডটি কাজ করে তা সম্পর্কে একটি ব্যাখ্যা যুক্ত করুন। বা কেন এটি সঠিক উত্তর
স্যুট বয় অ্যাপস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.