una sirve que para matriz llenar lista guardar elementos dinamica definir datos como cargar arreglos agregar python list list-manipulation

sirve - lista dinamica python



Algunos incorporados para rellenar una lista en python (8)

Creo que este enfoque es más visual y más pitón.

a = (a + N * [''''])[:N]

Tengo una lista de tamaño < N y quiero rellenarla con un valor al tamaño N.

Ciertamente, puedo usar algo como lo siguiente, pero siento que debería haber algo que me perdí:

>>> N = 5 >>> a = [1] >>> map(lambda x, y: y if x is None else x, a, ['''']*N) [1, '''', '''', '''', '''']


La respuesta de gnibbler es más agradable, pero si necesita un componente incorporado, puede usar itertools.izip_longest ( zip_longest en Py3k):

itertools.izip_longest( xrange( N ), list )

que devolverá una lista de tuplas ( i, list[ i ] ) rellenada a Ninguna. Si necesitas deshacerte del contador, haz algo como:

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )


No hay una función incorporada para esto. Pero podría componer las incorporaciones para su tarea (o cualquier otra cosa: p).

(Modificado del padnone de padnone y take recetas)

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)

Uso:

>>> list(pad([1,2,3], 7, '''')) [1, 2, 3, '''', '''', '''', '''']


Salir de kennytm:

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]


Si desea rellenar con Ninguno en lugar de '''', map () hace el trabajo:

>>> 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)


También puede utilizar un generador simple sin ningún tipo de complementos. Pero no rellenaría la lista, pero permitiría que la lógica de la aplicación tratara con una lista vacía.

De todos modos, iterador sin 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 __name__ == ''__main__'': import doctest doctest.testmod()


more-itertools es una biblioteca que incluye una herramienta padded especial para este tipo de problema:

import more_itertools as mit list(mit.padded(a, "", N)) # [1, '''', '''', '''', '''']

Alternativamente, more_itertools también implementa recetas de itertoles de Python , incluyendo padnone y take como lo menciona @kennytm, para que no tengan que volver a implementarse:

list(mit.take(N, mit.padnone(a))) # [1, None, None, None, None]

Si desea reemplazar el relleno predeterminado, use una lista de comprensión:

["" if i is None else i for i in mit.take(N, mit.padnone(a))] # [1, '''', '''', '''', '''']


a += [''''] * (N - len(a))

o si no quieres cambiar a en lugar

new_a = a + [''''] * (N - len(a))

Siempre puedes crear una subclase de lista y llamar al método lo que quieras.

class MyList(list): def ljust(self, n, fillvalue=''''): return self + [fillvalue] * (n - len(self)) a = MyList([''1'']) b = a.ljust(5, '''')