138

サイズ< Nのリストがあり、サイズNまで値を埋めたい。

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

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

14 に答える 14

220
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, '')
于 2010-08-09T09:43:12.150 に答える
39

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

a = (a + N * [''])[:N]
于 2016-10-07T18:18:55.573 に答える
30

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

(itertoolpadnonetakeレシピから変更)

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, '', '', '', '']
于 2010-08-09T10:09:24.780 に答える
9

more-itertoolspaddedこの種の問題のための特別なツールを含むライブラリです:

import more_itertools as mit

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

または、 @ kennytmを含む、および@ kennytmで言及されているように、 more_itertoolsPython itertoolsレシピも実装するため、再実装する必要はありません。padnonetake

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, '', '', '', '']
于 2017-08-22T18:38:50.730 に答える
7

gnibblerの答えの方が優れていますが、組み込みが必要な場合は、itertools.izip_longestzip_longestPy3kで)次を使用できます。

itertools.izip_longest( xrange( N ), list )

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

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )
于 2010-08-09T10:04:20.560 に答える
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()
于 2010-08-09T10:32:29.353 に答える
4

''の代わりに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)
于 2011-01-03T21:34:45.990 に答える
3

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]
于 2016-03-23T23:59:15.737 に答える
3
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

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

于 2019-04-17T20:16:17.087 に答える
3

* 反復可能な解凍演算子を使用できます:

N = 5
a = [1]

pad_value = ''
pad_size = N - len(a)

final_list = [*a, *[pad_value] * pad_size]
print(final_list)

出力:

[1, '', '', '', '']
于 2019-09-26T08:01:16.260 に答える
2

イテレータを使用し、次のデフォルト引数を利用しnextます。

i = iter(a)
a = [next(i, '') for _ in range(N)]

簡単な説明:

Nいずれにせよ、私たちはアイテムを作りたいのです。したがって、for _ in range(N)a次に、要素は、残りの部分から可能な限り多くする必要があります''。イテレータを使用して、a可能なすべての要素を取得します。を取得するStopIterationと、デフォルトのが返されます''

于 2020-12-03T09:15:46.813 に答える
1

:を使用して既存のリストに追加しnp.repeatます。

import numpy as np
a + list(np.repeat([''], (N - len(a))))
于 2021-01-06T01:07:33.133 に答える
1

要素のリストの前にパディングを追加する

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

要素のリストの後にパディングを追加する

a += [''] * (N - len(a))
于 2022-01-07T11:58:33.357 に答える
-2

リストを空の要素で埋める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 )]
于 2021-01-16T01:59:21.757 に答える