Crear una lista de elementos individuales repetidos n veces en Python
Artículos inmutables
Para artículos inmutables, como None, bools, ints, floats, strings, tuples o frozensets, puede hacerlo así:
[e] * 4
Tenga en cuenta que esto solo se usa con elementos inmutables (cadenas, tuplas, congelados,) 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, para no tener que dar un mapeo uno a uno altamente redundante.
schema = ['string'] * len(columns)
Artículos mutables
He usado Python durante mucho tiempo ahora, y nunca he visto un caso de uso en el que haría lo anterior con una instancia mutable. En su lugar, para obtener, por ejemplo, una lista, conjunto o dict 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 usar cualquier otro nombre.
Advertencias para usar el método inmutable con elementos mutables:
Tenga cuidado al hacer esto con objetos mutables , cuando cambia uno de ellos, todos cambian porque son todos el 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'])]