কিছু বিল্ট-ইন অজগরের মধ্যে একটি তালিকা প্যাড করতে


110

আমার < এন এন সাইজের একটি তালিকা রয়েছে এবং আমি এটির সাথে একটি মান দিয়ে এন আকারে প্যাড করতে চাই।

অবশ্যই, আমি নিম্নলিখিতগুলির মতো কিছু ব্যবহার করতে পারি, তবে আমার মনে হয় যে আমি মিস করেছি এমন কিছু হওয়া উচিত:

>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']

আপনি কেন এটা করতে চান? সম্ভবত আরও ভাল উপায় আছে।
ক্যাট্রিয়েল

আমি তালিকাটি কলামগুলির স্থির সংখ্যার সাথে ট্যাব-বিভাজিত স্ট্রিংয়ে সিরিয়ালকরণ করি।
নতুন

আপনার অর্থ কি আপনি '\ t'.join ([1,' ',' ',' ',' ']) এর মতো কিছু করছেন? আপনি কী বাস্তবায়ন করতে চান তা সম্পর্কে আপনি আমাদের আরও বলতে পারেন, তবে আমরা একটি ধারণা নিয়ে আসার চেষ্টা করতে পারি।
satoru

@ সাতোরু.লোগিক: হ্যাঁ, প্রিন্ট >> এ_স্ট্রিম, '\ t'.join (the_list) আমি প্রয়োগ করতে
চাইছি

উত্তর:


165
a += [''] * (N - len(a))

বা আপনি aযদি জায়গা পরিবর্তন করতে না চান

new_a = a + [''] * (N - len(a))

আপনি সর্বদা তালিকার একটি সাবক্লাস তৈরি করতে পারেন এবং আপনি যা খুশি তাই পদ্ধতিটিকে কল করতে পারেন

class MyList(list):
    def ljust(self, n, fillvalue=''):
        return self + [fillvalue] * (n - len(self))

a = MyList(['1'])
b = a.ljust(5, '')

3
এই সৌন্দর্য অনেক ভালো, কিন্তু আমি এখনও একটি ভালো কিছু আশা করতে ভরাট বা প্যাড পদ্ধতি বা ফাংশন =)
newtover

30

আমি মনে করি এই পদ্ধতিটি আরও চাক্ষুষ এবং পাইথোনিক ic

a = (a + N * [''])[:N]

এটি বুঝতে আমার অর্ধ মিনিট সময় নেয়। গৃহীত উত্তরটি আরও সোজা ward
রিচার্ড মোহন

3
@ রিচার্ডমেন "পাইথোনিক" এর অর্থ "আইডোমেটিক"। আপনি পাইথন যত দীর্ঘ ব্যবহার করবেন তত প্রাকৃতিক আপনি এই সিনট্যাক্সটি পাবেন।
নুনো আন্দ্রে

4
আমি জানি 'পাইথোনিক' এর অর্থ কী। এবং আমি ২০১৪ সাল থেকে অবিচ্ছিন্নভাবে পাইথন ব্যবহার করছি I আমি এখনও আপনার উত্তরটি প্রাকৃতিকভাবে খুঁজে পাই না।
রিচার্ড মোহন

একটি মধ্যবর্তী নিক্ষেপ-তালিকার তালিকা তৈরি করা কী অজগরটিকে তৈরি করে?
ডিলানইং

1
@ ডায়ালান ইয়ং প্রথমবারের মতো নয় N < len(a)। এটি আপনার দেওয়া দ্বিতীয় উত্তরের ক্ষেত্রে case
কন সাইক

25

এর জন্য কোনও অন্তর্নির্মিত ফাংশন নেই। তবে আপনি নিজের কাজের জন্য বিল্ট-ইনগুলি রচনা করতে পারেন (বা যে কোনও কিছু: পি)।

(ইটারটোল padnoneএবং takeরেসিপিগুলি থেকে সংশোধিত )

from itertools import chain, repeat, islice

def pad_infinite(iterable, padding=None):
   return chain(iterable, repeat(padding))

def pad(iterable, size, padding=None):
   return islice(pad_infinite(iterable, padding), size)

ব্যবহার:

>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']

6

জিনিবলারের উত্তরটি দুর্দান্ত, তবে আপনার যদি বিল্টিনের প্রয়োজন হয় তবে আপনি itertools.izip_longest( zip_longestপাই 3 কে) ব্যবহার করতে পারেন :

itertools.izip_longest( xrange( N ), list )

যা পূর্বে ( i, list[ i ] )পূর্ণ নয় এমন তালিকার একটি তালিকা ফিরিয়ে দেবে । যদি কাউন্টার থেকে মুক্তি পাওয়ার দরকার হয় তবে এর মতো কিছু করুন:

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )

1
আমি izip_longest সম্পর্কে জানতাম তবে ফলাফলটি দেখতে সুন্দর দেখাচ্ছে না =)
নতুন

2
আমি বিশ্বাস করি আপনি বলতে চাইছেন operator.itemgetter()। এছাড়াও Noneমানগুলি প্রতিস্থাপন করা প্রয়োজন ""
পাইলং

5

আপনি কোনও বিল্ড ইনগুলি ছাড়াই একটি সাধারণ জেনারেটর ব্যবহার করতে পারেন। তবে আমি তালিকাটি প্যাড করব না, তবে অ্যাপ্লিকেশনটিকে যুক্তিযুক্তভাবে খালি তালিকার সাথে চুক্তি করুন।

যাইহোক, বিল্টিনগুলি ছাড়া পুনরাবৃত্তিকারী

def pad(iterable, padding='.', length=7):
    '''
    >>> iterable = [1,2,3]
    >>> list(pad(iterable))
    [1, 2, 3, '.', '.', '.', '.']
    '''
    for count, i in enumerate(iterable):
        yield i
    while count < length - 1:
        count += 1
        yield padding

if __name__ == '__main__':
    import doctest
    doctest.testmod()

4

আপনি যদি '' এর পরিবর্তে কারও সাথে প্যাড করতে চান, ম্যাপ () কাজটি করে:

>>> map(None,[1,2,3],xrange(7))

[(1, 0), (2, 1), (3, 2), (None, 3), (None, 4), (None, 5), (None, 6)]

>>> zip(*map(None,[1,2,3],xrange(7)))[0]

(1, 2, 3, None, None, None, None)

2
খোলামেলাভাবে বলতে গেলে, একটি + [''] * (এন-লেন (ক)) আরও পরিষ্কার দেখাচ্ছে। এছাড়াও, এটি তালিকার জন্য ingালাইয়ের অভাব রয়েছে। তবে যাইহোক আপনাকে ধন্যবাদ।
newtover

4

more-itertoolsএমন একটি গ্রন্থাগার যা paddedএই ধরণের সমস্যার জন্য একটি বিশেষ সরঞ্জাম অন্তর্ভুক্ত করে :

import more_itertools as mit

list(mit.padded(a, "", N))
# [1, '', '', '', '']

অন্যথা, more_itertoolsএছাড়াও প্রয়োগ পাইথন রেসিপি itertools সহ padnoneএবং takeযেমন @kennytm উল্লেখ, তারা reimplemented করা হবে না তাই হয়:

list(mit.take(N, mit.padnone(a)))
# [1, None, None, None, None]

আপনি যদি ডিফল্ট Noneপ্যাডিং প্রতিস্থাপন করতে চান তবে একটি তালিকা উপলব্ধি ব্যবহার করুন:

["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']

2

কেনেটিম থেকে দূরে যেতে:

def pad(l, size, padding):
    return l + [padding] * abs((len(l)-size))

>>> l = [1,2,3]
>>> pad(l, 7, 0)
[1, 2, 3, 0, 0, 0, 0]


1
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

এটি তালিকা তৈরি এবং সংযোজন সম্পর্কিত কোনও সমাধানের বিপরীতে কোনও অতিরিক্ত বরাদ্দ এড়ানো যায় [value] * extra_length। "প্রসারিত" পদ্ধতিটি প্রথমে __length_hint__পুনরুক্তকারীকে কল করে এবং পুনরুক্তিদাতা lথেকে এটি পূরণ করার আগে তার জন্য বরাদ্দ প্রসারিত করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.