web-dev-qa-db-ja.com

pythonでリストをパディングするビルトイン

サイズ<[〜#〜] n [〜#〜]のリストがあり、サイズNまで値を埋め込みます。

確かに、私は次のようなものを使用できますが、私は見逃したものがあるはずだと感じています:

>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
86
newtover
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, '')
136
John La Rooy

このアプローチは、より視覚的でPythonicだと思います。

a = (a + N * [''])[:N]
21
Nuno André

これには組み込み関数はありません。ただし、タスク(または:p)のビルトインを作成できます。

(itertoolの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, '', '', '', '']
21
kennytm

gnibblerの答えはより良いですが、組み込みが必要な場合は、 itertools.izip_longestZip_longest Py3kで)

itertools.izip_longest( xrange( N ), list )

タプルのリストを返します( i, list[ i ] ) Noneに記入。カウンターを取り除く必要がある場合は、次のようにします。

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

''の代わりにNoneでパディングしたい場合、map()は仕事をします:

>>> 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)
4
Federico

ビルドインなしでシンプルなジェネレーターを使用することもできます。しかし、リストをパディングするのではなく、アプリケーションロジックに空のリストを処理させます。

とにかく、ビルドインのないイテレーター

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 __== '__main__':
    import doctest
    doctest.testmod()
4
Thierry

more-itertools は、この種の問題のための特別な padded ツールを含むライブラリです。

import more_itertools as mit

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

または、more_itertoolsは、Python itertools recipespadnone および take を含む= @kennytmで述べたように、再実装する必要はありません。

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, '', '', '', '']
3
pylang

Kennytmを終了するには:

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
aberger
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

これにより、リストの作成と追加に依存するソリューションとは異なり、余分な割り当てが回避されます[value] * extra_length。 「extend」メソッドは、最初に__length_hint__をイテレータで使用し、イテレータから入力する前にlの割り当てをそれだけ拡張します。

0
Paul Crowley