Ich habe eine Liste mit den Größen < N und möchte sie mit einem Wert auf die Größe N auffüllen.
Natürlich kann ich etwas wie das Folgende verwenden, aber ich bin der Meinung, dass es etwas geben sollte, das ich verpasst habe:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
a += [''] * (N - len(a))
oder wenn Sie a
nicht ändern möchten
new_a = a + [''] * (N - len(a))
sie können jederzeit eine Unterklasse der Liste erstellen und die Methode wie gewünscht aufrufen
class MyList(list):
def ljust(self, n, fillvalue=''):
return self + [fillvalue] * (n - len(self))
a = MyList(['1'])
b = a.ljust(5, '')
Ich denke, dieser Ansatz ist visueller und pythonischer.
a = (a + N * [''])[:N]
Hierfür ist keine Funktion eingebaut. Sie können jedoch die integrierten Funktionen für Ihre Aufgabe (oder etwas anderes: p) erstellen.
(Geändert von den Rezepten padnone
und take
von itertool)
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)
Verwendung:
>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']
gnibblers antwort ist netter, aber wenn du ein eingebautes brauchst, könntest du itertools.izip_longest
(Zip_longest
in Py3k):
itertools.izip_longest( xrange( N ), list )
was wird eine Liste von Tupeln zurückgeben ( i, list[ i ] )
ausgefüllt mit None. Wenn Sie den Zähler loswerden müssen, gehen Sie wie folgt vor:
map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )
Wenn Sie mit None anstelle von '' auffüllen möchten, übernimmt map () die Aufgabe:
>>> 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)
Sie können auch einen einfachen Generator ohne Build-Ins verwenden. Aber ich würde die Liste nicht auffüllen, sondern die Anwendungslogik mit einer leeren Liste umgehen lassen.
Wie auch immer, Iterator ohne 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 __== '__main__':
import doctest
doctest.testmod()
more-itertools
ist eine Bibliothek, die ein spezielles padded
-Tool für diese Art von Problem enthält:
import more_itertools as mit
list(mit.padded(a, "", N))
# [1, '', '', '', '']
Alternative, more_itertools
implementiert auch Python itertools recipes einschließlich padnone
und take
= wie von @kennytm erwähnt, müssen sie nicht erneut implementiert werden:
list(mit.take(N, mit.padnone(a)))
# [1, None, None, None, None]
Wenn Sie die Standardauffüllung None
ersetzen möchten, verwenden Sie ein Listenverständnis:
["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']
Kennytm verlassen:
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]
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))
Dies vermeidet jegliche zusätzliche Zuordnung im Gegensatz zu jeder Lösung, die vom Erstellen und Anhängen der Liste abhängt [value] * extra_length
. Die Methode "extend" ruft zuerst __length_hint__
Für den Iterator auf und erweitert die Zuordnung für l
um diesen Wert, bevor sie vom Iterator aus ausgefüllt wird.