Crear una lista de elementos individuales repetidos N veces

5 minutos de lectura

Crear una lista de elementos individuales repetidos N veces
quimeracodificador

Quiero crear una serie de listas, todas de diferentes longitudes. Cada lista contendrá el mismo elemento. erepetido n tiempos (donde n = longitud de la lista).

¿Cómo creo las listas, sin usar una lista de comprensión? [e for number in xrange(n)] para cada lista?

1646757072 350 Crear una lista de elementos individuales repetidos N veces
marca byers

También puedes escribir:

[e] * n

Debe tener en cuenta que si e es, por ejemplo, una lista vacía, obtiene una lista con n referencias a la misma lista, no n listas vacías independientes.

Pruebas de rendimiento

A primera vista 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, ¡simplemente crea un objeto que se puede usar 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

Así que si quieres una lista, usa [e] * n. Si desea generar los elementos perezosamente, utilice repeat.

  • Es muy poco probable que el rendimiento de crear una lista con elementos idénticos sea un componente crítico del rendimiento de un programa de Python.

    – Arturo

    20 de junio de 2016 a las 17:25

  • Como se mencionó anteriormente, si e es una lista vacía [[]] * n puede producir resultados inesperados. Para crear sublistas vacías únicas, use for-comprehension: [[] for i in range(0,n)]

    – Josías Yoder

    15 de agosto de 2017 a las 17:01


1646757073 746 Crear una lista de elementos individuales repetidos N veces
gaefan

>>> [5] * 4
[5, 5, 5, 5]

Tenga cuidado cuando el elemento que se repite es 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]]

  • ¿Tiene sentido? ¿Crear una lista, luego cambiar un elemento y cambiar toda la lista?

    – Timo

    2 de enero de 2021 a las 14:38

  • @Timo. Si. La lista externa almacena cuatro referencias a la misma lista interna.

    – wotanii

    8 de febrero de 2021 a las 12:36


Crear una lista de elementos individuales repetidos N veces
Rusia debe sacar a Putin

Crear una lista de elementos individuales repetidos n veces en Python

Dependiendo de su caso de uso, querrá usar diferentes técnicas con diferentes semánticas.

Multiplicar 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, conjuntos congelados) en la lista, porque todos apuntan al mismo elemento en el mismo lugar en la memoria. Lo uso con frecuencia cuando tengo que construir una tabla con un esquema de todas las cadenas, de modo que no tenga que dar una asignación de uno a uno muy redundante.

schema = ['string'] * len(columns)

Multiplicar la lista donde queremos que se repita el mismo elemento

Multiplicar una lista nos da el mismo elementos una y otra vez. La necesidad de esto es rara:

[iter(iterable)] * 4

Esto se usa a veces 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
[<range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>]

Objetos 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 su lugar, para obtener, por ejemplo, una lista, un conjunto o un 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 descartable en este contexto.

Si solo tienes el número, sería:

list_of_lists = [[] for _ in range(4)]

los _ 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:

Cuidado con hacer esto con objetos mutablescuando cambias 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'])]

1646757076 69 Crear una lista de elementos individuales repetidos N veces
jochen ritzel

Itertools tiene una función solo para eso:

import itertools
it = itertools.repeat(e,n)

por supuesto itertools le da un iterador en lugar de una lista. [e] * n le da una lista, pero, dependiendo de lo que haga con esas secuencias, el itertools variante puede ser mucho más eficiente.

Como han señalado otros, usar el operador * para un objeto mutable duplica las referencias, por lo que si cambia una, las cambia todas. Si desea crear instancias independientes de un objeto mutable, su sintaxis xrange es la forma más pitónica de hacerlo. Si le molesta tener una variable con nombre que nunca se usa, puede usar la variable de subrayado anónima.

[e for _ in xrange(n)]

1646757076 269 Crear una lista de elementos individuales repetidos N veces
Científico loco

[e] * n

Deberia trabajar

1646757078 663 Crear una lista de elementos individuales repetidos N veces
Shrm

Si está buscando una repetición simple como:

[1, 2, 3, 1, 2, 3, 1, 2, 3]

simplemente use:

[1, 2, 3] * 3

Pero si buscas:

[1, 1, 1, 2, 2, 2, 3, 3, 3]

Este es mejor mientras toma más tiempo:

numpy.concatenate([([i]*3) for i in [1,2,3]], axis=0)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad