Tenemos la mejor solución que hemos encontrado en línea. Nosotros deseamos que te sea útil y si quieres compartir algo que nos pueda ayudar a mejorar puedes hacerlo..
Solución:
También puedes escribir:
[e] * n
Debe tener en cuenta que si e es, por ejemplo, una lista vacía, obtendrá una lista con n referencias a la misma lista, no n listas vacías independientes.
Pruebas de rendimiento
A primera vista es parece esa repetición es la forma más rápida de crear una lista con n elementos idénticos:
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
Pero espera, no es una prueba justa …
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
La función itertools.repeat
en realidad no crea la lista, ¡solo crea un objeto que puede usarse para crear una lista si lo desea! Intentémoslo de nuevo, pero convirtiéndolo en una lista:
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
Entonces, si quieres una lista, usa [e] * n
. Si desea generar los elementos de forma perezosa, utilice repeat
.
>>> [5] * 4
[5, 5, 5, 5]
Tenga cuidado cuando el elemento que se repite sea una lista. La lista no se clonará: ¡todos los elementos se referirán a la misma lista!
>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]
Crear una lista de un solo elemento repetido n veces en Python
Dependiendo de su caso de uso, desea utilizar diferentes técnicas con diferente semántica.
Multiplica una lista de elementos inmutables
Para elementos inmutables, como None, bools, ints, floats, strings, tuples o frozensets, puede hacerlo así:
[e] * 4
Tenga en cuenta que esto generalmente solo se usa con elementos inmutables (cadenas, tuplas, frozensets) en la lista, porque todos apuntan al mismo elemento en el mismo lugar en la memoria. Utilizo esto con frecuencia cuando tengo que construir una tabla con un esquema de todas las cadenas, de modo que no tengo que dar un mapeo uno a uno altamente redundante.
schema = ['string'] * len(columns)
Multiplica la lista donde queremos que se repita el mismo elemento
Multiplicar una lista nos da la mismo elementos una y otra vez. La necesidad de esto es rara:
[iter(iterable)] * 4
Esto a veces se usa para mapear un iterable en una lista de listas:
>>> iterable = range(12)
>>> a_list = [iter(iterable)] * 4
>>> [[next(l) for l in a_list] for i in range(3)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
Podemos ver eso a_list
contiene el mismo iterador de rango cuatro veces:
>>> a_list
[, , , ]
Elementos mutables
He usado Python durante mucho tiempo y he visto muy pocos casos de uso en los que haría lo anterior con objetos mutables.
En cambio, para obtener, digamos, una lista, conjunto o dictado vacío mutable, debe hacer algo como esto:
list_of_lists = [[] for _ in columns]
El guión bajo es simplemente un nombre de variable desechable en este contexto.
Si solo tiene el número, sería:
list_of_lists = [[] for _ in range(4)]
El _
no es realmente especial, pero su verificador de estilo de entorno de codificación probablemente se quejará si no tiene la intención de usar la variable y usa cualquier otro nombre.
Advertencias para usar el método inmutable con elementos mutables:
Cuidado con hacer esto con objetos mutables, cuando cambia uno de ellos, todos cambian porque son todos los mismo objeto:
foo = [[]] * 4
foo[0].append('x')
foo ahora regresa:
[['x'], ['x'], ['x'], ['x']]
Pero con objetos inmutables, puede hacer que funcione porque cambia la referencia, no el objeto:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
Pero nuevamente, los objetos mutables no son buenos para esto, porque las operaciones en el lugar cambian el objeto, no la referencia:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]