一些内置的在Python中填充列表

我有一个大小< 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)) 

你总是可以创build一个列表的子类,并调用任何你喜欢的方法

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

没有内置的function。 但是你可以为你的任务(或者任何东西: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, '', '', '', ''] 

gnibbler的答案更好,但如果你需要一个内置的,你可以使用itertools.izip_longestzip_longest在Py3k):

 itertools.izip_longest( xrange( N ), list ) 

这将返回一个元组列表( i, list[ i ] )填充到无。 如果您需要摆脱柜台,请执行以下操作:

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

你也可以使用一个简单的发电机没有任何生成插件。 但是我不打算列表,但让应用程序逻辑处理一个空的列表。

总之,没有buildins的迭代器

 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) 

我认为这种方法更具视觉和pythonic。

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

more-itertools是一个库,包含一个特殊的padded工具,用于解决这类问题:

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

另外, more_itertools还实现Python itertools的食谱,包括padnonetake由@kennytm提到的,所以他们不必重新实现:

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

如果您希望replace默认的None填充,请使用列表parsing:

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

为了离开肯尼特姆:

 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]