У меня есть список размером < 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))
вы всегда можете создать подкласс list и вызывать метод как вам угодно
class MyList(list):
def ljust(self, n, fillvalue=''):
return self + [fillvalue] * (n - len(self))
a = MyList(['1'])
b = a.ljust(5, '')
Для этого нет встроенной функции. Но вы можете составить встроенные функции для вашей задачи (или для чего угодно :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_longest
( zip_longest
в Py3k):
itertools.izip_longest( xrange( N ), list )
, который вернет список кортежей (i, list [i])
заменено на «Нет». Если вам нужно избавиться от счетчика, сделайте что-нибудь вроде:
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()