2010-05-07 17 views

Respuesta

22

itertools.repeat() es tu amigo.

L = list(itertools.repeat("a", 20)) # 20 copies of "a" 

L = list(itertools.repeat(10, 20)) # 20 copies of 10 

L = list(itertools.repeat(['x','y'], 20)) # 20 copies of ['x','y'] 

Tenga en cuenta que en el tercer caso, ya que las listas se denominan por referencia, el cambio de una instancia de [ 'x', 'y'] en la lista va a cambiar todos ellos, ya que todos ellos se refieren a la misma lista.

Para evitar hacer referencia al mismo elemento, se puede utilizar una comprensión en lugar de crear nuevos objetos para cada elemento de la lista: (. Por Python 2.x, utilice xrange() en lugar de range() para el rendimiento)

L = [['x','y'] for i in range(20)] 

+3

El uso de un guión en lugar de 'I' para indicar que es una de usar y tirar la variable es una buena práctica IMO: 'L = [['x', 'y'] para _ en el rango (20)]' – Zaz

31

Usted puede utilizar el operador *:

L = ["a"] * 10 
L = [0] * 10 
L = [["x", "y"]] * 10 

Tenga cuidado este crear N copias del mismo elemento, lo que significa que en el tercer caso crea una lista que contiene N referencias a la lista ["x", "y"]; cambiando L[0][0] por ejemplo modificará todas las demás copias, así:

>>> L = [["x", "y"]] * 3 
>>> L 
[['x', 'y'], ['x', 'y'], ['x', 'y']] 
>>> L[0][0] = "z" 
[['z', 'y'], ['z', 'y'], ['z', 'y']] 

En este caso es posible que desee utilizar una lista por comprensión:

L = [["x", "y"] for i in range(10)] 
+3

+1: El * operador que actúa en las listas solo pretende hacer lo que el póster original quería. La lista (itertools.La solución repeat()) es un martillo demasiado grande para una uña pequeña. – EOL

+0

Recibirás una bolsa de oro ahora, ya que la he votado por encima y la respuesta aceptada, de modo que esta respuesta podría tener ** 2x ** votos en comparación con la respuesta aceptada que tiene un mínimo de 10 votos. Ambas respuestas son buenas, independientemente de la insignia de oro, por cierto. :-) – Nawaz

+1

En el último caso, ya que no está usando la variable 'i', creo que lo correcto es llamarlo' _', es decir 'L = [['x', 'y'] para _ en el rango (10)] '. – krs013

1

Se podría hacer algo como

x = <your object> 
n = <times to be repeated> 
L = [x for i in xrange(n)] 

Rango sustitutivo (n) para Python 3.

0

Si desea instancias únicas y al igual que a golf, esto es (ligeramente) más corto:

L = [['x', 'y'] for _ in []*10] 

Lo más loco es que es también (sensiblemente) más rápido:

>>> timeit("[['x', 'y'] for _ in [0]*1000]", number=100000) 
8.252447253966238            
>>> timeit("[['x', 'y'] for _ in range(1000)]", number=100000) 
9.461477918957826 
Cuestiones relacionadas