Question

Say I have this

b = 3
l = [1, 2]

I want to modify l so that each element appears as many times as b. So that:

l = [1, 1, 1, 2, 2, 2]

I used this:

for x in l:
  for m in range(b):
    l.append(x)

But it resulted in an infinite loop. Any help would be appreciated. I would prefer you guys to give ideas rather than give me the code. Thanks.

Was it helpful?

Solution

My 2 cents :

Another way to achieve this would also be to take advantage of the fact you can multiply lists in Python.

>>> l = [1, 2, 3]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

A simple call to the sorted function allows to sort it back :

>>> b = 3    
>>> l = [1, 2]
>>> sorted(l * b)
[1, 1, 1, 2, 2, 2]

OTHER TIPS

You can use a list comprehension:

>>> b = 3
>>> x = [1, 2]
>>> l = [x for x in l for _ in range(b)]
>>> l
[1, 1, 1, 2, 2, 2]
>>>

Now, to fix your issue:

You might want to create a new list, and append to that list

>>> l  = [1, 2]
>>> y = []
>>> b = 3
>>> for x in l:
...   for i in range(b):
...     y.append(x)
...
>>> y
[1, 1, 1, 2, 2, 2]

I would prefer the list comprehension method though.

Your main problem is that it's unsafe to modify the list as you iterate over it. You could work around that by building a new list - the various itertools and comprehension answers show some ways to do that, or you could just use your for loop if you like.

Since you asked for ideas rather than code, I'll point out that itertools.repeat is another useful tool. It should be fairly obvious how to use that to multiply a given element of the list - you'd then need to figure out how to combine the iterators for each element of your list into a single list. For that, itertools.chain is useful, using either the * syntax to unpack a sequence of repeat iterators or the itertools.chain.from_iterable constructor.

This would essentially be the same idea as freyrs' answer, just creating a repeat iterator for each element rather than creating and multiplying a list for each element.

Can use itertools for this:

from itertools import chain
list(chain(*[[i]*b for i in l]))

Which gives output:

[1, 1, 1, 2, 2, 2]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top