У меня есть список размером < N, и я хочу дополнить его значением до размера N.
Конечно, я могу использовать что-то вроде следующего, но я чувствую, что должно быть что-то, что я пропустил:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
python
list
list-manipulation
новый
источник
источник
Ответы:
или если вы не хотите менять
a
местовы всегда можете создать подкласс списка и вызвать метод как угодно
источник
Я думаю, что этот подход более наглядный и питонический.
источник
N < len(a)
. Это случай второго предоставленного вами ответа.Для этого нет встроенной функции. Но вы можете составить встроенные программы для своей задачи (или чего угодно: p).
(Изменено из itertool's
padnone
иtake
рецептов)Использование:
источник
Ответ gnibbler лучше, но если вам нужна встроенная функция , вы можете использовать
itertools.izip_longest
(zip_longest
в Py3k):который вернет список кортежей,
( i, list[ i ] )
заполненный значением None. Если вам нужно избавиться от счетчика, сделайте что-нибудь вроде:источник
operator.itemgetter()
. ТакжеNone
значения необходимо было заменить на""
.Вы также можете использовать простой генератор без каких-либо сборок. Но я бы не стал дополнять список, а позволил логике приложения работать с пустым списком.
Так или иначе, итератор без сборок
источник
Если вы хотите использовать None вместо '', map () выполнит эту работу:
источник
more-itertools
- это библиотека, которая включает специальныйpadded
инструмент для решения такого рода проблем:В качестве альтернативы
more_itertools
также реализует рецепты Python itertools, включаяpadnone
иtake
как указано @kennytm, поэтому их не нужно повторно реализовывать:Если вы хотите заменить
None
отступ по умолчанию , используйте понимание списка:источник
Чтобы выйти из kennytm:
источник
вы можете использовать
*
итеративный оператор распаковки :вывод:
источник
Это позволяет избежать какого-либо дополнительного выделения, в отличие от любого решения, которое зависит от создания и добавления списка
[value] * extra_length
. Метод «extend» сначала вызывает__length_hint__
итератор и наl
столько же увеличивает выделение , прежде чем заполнить его из итератора.источник