Mam listę o rozmiarze < N i chcę dopełnić ją do rozmiaru N wartością.
Oczywiście mogę użyć czegoś podobnego do następującego, ale czuję, że powinno być coś, co przegapiłem:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
python
list
list-manipulation
newtover
źródło
źródło
Odpowiedzi:
lub jeśli nie chcesz zmieniać
a
miejscazawsze możesz utworzyć podklasę listy i wywołać metodę, jak chcesz
źródło
Myślę, że to podejście jest bardziej wizualne i pytoniczne.
źródło
N < len(a)
. Tak jest w przypadku drugiej podanej przez Ciebie odpowiedzi.Nie ma do tego wbudowanej funkcji. Ale możesz skomponować wbudowane funkcje do swojego zadania (lub cokolwiek: p).
(Zmodyfikowane na podstawie itertool's
padnone
itake
przepisów)Stosowanie:
źródło
Odpowiedź gnibblera jest ładniejsza, ale jeśli potrzebujesz wbudowanego, możesz użyć
itertools.izip_longest
(zip_longest
w Py3k):co zwróci listę
( i, list[ i ] )
wypełnionych krotek na Brak. Jeśli chcesz pozbyć się licznika, zrób coś takiego:źródło
operator.itemgetter()
. RównieżNone
wartości, które należało zastąpić""
.Możesz także użyć prostego generatora bez żadnych wbudowanych programów. Ale nie wypełniłbym listy, ale pozwoliłbym logice aplikacji zająć się pustą listą.
W każdym razie iterator bez buildins
źródło
Jeśli chcesz uzupełnić brakiem zamiast „”, map () wykona zadanie:
źródło
more-itertools
to biblioteka, która zawiera specjalnepadded
narzędzie do tego rodzaju problemów:Alternatywnie
more_itertools
implementuje również receptury Python itertools, w tympadnone
itake
jak wspomniał @kennytm, więc nie trzeba ich ponownie wdrażać:Jeśli chcesz zamienić domyślne
None
wypełnienie, użyj wyrażenia listowego:źródło
Aby wyjść z KennyTM:
źródło
możesz użyć
*
iterowalnego operatora rozpakowywania :wynik:
źródło
Pozwala to uniknąć dodatkowej alokacji, w przeciwieństwie do jakiegokolwiek rozwiązania, które polega na tworzeniu i dołączaniu listy
[value] * extra_length
. Metoda „rozszerz” najpierw wywołuje__length_hint__
iterator i rozszerza alokację ol
tyle przed wypełnieniem jej z iteratora.źródło