7

What is the most efficient method to repeat a list up to a max element length?

To take this:

lst = ['one', 'two', 'three']
max_length = 7

And produce this:

final_list = ['one', 'two', 'three', 'one', 'two', 'three', 'one']
Georgy
  • 9,972
  • 7
  • 57
  • 66
Pylander
  • 1,383
  • 16
  • 33

2 Answers2

19

I'd probably use iterools.cycle and itertools.islice:

>>> from itertools import cycle, islice
>>> lst = [1, 2, 3]
>>> list(islice(cycle(lst), 7))
[1, 2, 3, 1, 2, 3, 1]
mgilson
  • 283,004
  • 58
  • 591
  • 667
9

Multiply appropriately?

>>> lst = ['one', 'two', 'three']
>>> max_length = 7
>>> 
>>> q, r = divmod(max_length, len(lst))
>>> q * lst + lst[:r]
['one', 'two', 'three', 'one', 'two', 'three', 'one']

Benchmarked mine and mgilson's solution, mine looks more efficient, for example for the below test mine takes about 0.7 seconds while mgilson's takes about 2.8 seconds.

from timeit import timeit
data = "lst = ['one', 'two', 'three'] * 1000; max_length = 12345678"

print(timeit('q, r = divmod(max_length, len(lst)); q * lst + lst[:r]',
             data,
             number=10))

print(timeit('list(islice(cycle(lst), max_length))',
             data + '; from itertools import cycle, islice',
             number=10))
Stefan Pochmann
  • 25,851
  • 7
  • 41
  • 100