tags:

views:

154

answers:

3

Suppose I have a given Object (a string "a", a number - let's say 0, or a list ['x','y'] )

I'd like to create list containing many copies of this object, but without using a for loop:

L = ["a", "a", ... , "a", "a"]

or

L = [0, 0, ... , 0, 0]

or

L = [['x','y'],['x','y'], ... ,['x','y'],['x','y']]

I'm especially interested in the third case. Thanks!

+4  A: 

itertools.repeat() is your friend.

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']

Note that in the third case, since lists are referred to by reference, changing one instance of ['x','y'] in the list will change all of them, since they all refer to the same list.

To avoid referencing the same item, you can use a comprehension instead to create new objects for each list element:

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

(For Python 2.x, use xrange() instead of range() for performance.)

Amber
+9  A: 

You can use the * operator :

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

Be careful this create N copies of the same item, meaning that in the third case you create a list containing N references to the ["x", "y"] list ; changing L[0][0] for example will modify all other copies as well:

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

In this case you might want to use a list comprehension:

L = [["x", "y"] for i in range(10)]
Luper Rouch
+1: The * operator acting on lists is just meant to do what the original poster wanted. The list(itertools.repeat()) solution is too big a hammer for a small nail.
EOL
A: 

You could do something like

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

Substitute range(n) for Python 3.

zerocrates