サイズ< Nのリストがあり、サイズNまで値を埋めたい。
確かに、私は次のようなものを使用することができますが、私が見逃したものがあるはずだと感じています:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
サイズ< Nのリストがあり、サイズNまで値を埋めたい。
確かに、私は次のようなものを使用することができますが、私が見逃したものがあるはずだと感じています:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
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, '')
このアプローチは、より視覚的でPython的だと思います。
a = (a + N * [''])[:N]
このための組み込み関数はありません。ただし、タスク(または:p)のビルトインを作成することはできます。
(itertoolpadnone
と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, '', '', '', '']
more-itertools
padded
この種の問題のための特別なツールを含むライブラリです:
import more_itertools as mit
list(mit.padded(a, "", N))
# [1, '', '', '', '']
または、 @ kennytmを含む、および@ kennytmで言及されているように、 more_itertools
Python itertoolsレシピも実装するため、再実装する必要はありません。padnone
take
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, '', '', '', '']
gnibblerの答えの方が優れていますが、組み込みが必要な場合は、itertools.izip_longest
(zip_longest
Py3kで)次を使用できます。
itertools.izip_longest( xrange( N ), list )
これにより、入力されたタプルのリストが( i, list[ i ] )
Noneに返されます。カウンターを取り除く必要がある場合は、次のようにします。
map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )
ビルドインなしで単純なジェネレーターを使用することもできます。ただし、リストを埋めることはしませんが、アプリケーションロジックに空のリストを処理させます。
とにかく、ビルドインのないイテレータ
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()
''の代わりに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)
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]
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))
これにより、リストの作成と追加に依存するソリューションとは異なり、余分な割り当てが回避されます[value] * extra_length
。「extend」メソッドは最初にイテレータを呼び出し__length_hint__
、イテレータから入力する前に、その分だけ割り当てを拡張しl
ます。
*
反復可能な解凍演算子を使用できます:
N = 5
a = [1]
pad_value = ''
pad_size = N - len(a)
final_list = [*a, *[pad_value] * pad_size]
print(final_list)
出力:
[1, '', '', '', '']
イテレータを使用し、次のデフォルト引数を利用しnext
ます。
i = iter(a)
a = [next(i, '') for _ in range(N)]
N
いずれにせよ、私たちはアイテムを作りたいのです。したがって、for _ in range(N)
。a
次に、要素は、残りの部分から可能な限り多くする必要があります''
。イテレータを使用して、a
可能なすべての要素を取得します。を取得するStopIteration
と、デフォルトのが返されます''
。
:を使用して既存のリストに追加しnp.repeat
ます。
import numpy as np
a + list(np.repeat([''], (N - len(a))))
要素のリストの前にパディングを追加する
a[:0] += [''] * (N - len(a))
要素のリストの後にパディングを追加する
a += [''] * (N - len(a))
リストを空の要素で埋めるPythonの方法は、リスト内包表記を使用することです。
my_list = [1,2]
desired_len = 3
# Ensure that the length of my list is 3 elements
[my_list.extend(['']) for _ in range(desired_len - len(my_list))]
[my_list.pop() for _ in range(len(my_list)-desired_len )]