Некоторые встроенные средства для заполнения списка в python

У меня есть список размером < N , и я хочу дополнить его размером N со значением.

Конечно, я могу использовать что-то вроде следующего, но я чувствую, что должно быть что-то, что я пропустил:

>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
91
задан Ian Mackinnon 21 March 2013 в 17:20
поделиться

4 ответа

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, '')
141
ответ дан 24 November 2019 в 06:44
поделиться

Для этого нет встроенной функции. Но вы можете составить встроенные функции для вашей задачи (или для чего угодно :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
ответ дан 24 November 2019 в 06:44
поделиться

Ответ 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 ) )
5
ответ дан 24 November 2019 в 06:44
поделиться

Вы также можете использовать простой генератор без каких-либо сборок. Но я бы не стал дополнять список, а позволил логике приложения работать с пустым списком.

В любом случае, итератор без сборок

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()
4
ответ дан 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: