J'aime les solutions les plus simples possibles (y compris l'efficacité). Il n'est pas toujours évident de savoir si la solution est telle. Quoi qu'il en soit, la range()
dans Python 3 est un générateur. Vous pouvez l'intégrer à n'importe quelle construction qui fait de l'itération. Le générateur list()
est capable de construire une valeur de liste à partir de n'importe quel itérable. Les +
pour les listes effectue la concaténation. J'utilise des valeurs plus petites dans l'exemple :
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(10, 20))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> list(range(5)) + list(range(10,20))
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
C'est ce que range(5) + range(10, 20)
exactement dans Python 2.5 -- parce que range()
a renvoyé une liste.
Dans Python 3, elle n'est utile que si vous voulez vraiment construire la liste. Sinon, je recommande l'utilisation de la fonction Lev Levitsky's solution avec itertools.chain . La documentation présente également une mise en œuvre très simple :
def chain(*iterables):
# chain('ABC', 'DEF') --> A B C D E F
for it in iterables:
for element in it:
yield element
La solution de Inbar Rose est bien et fonctionnellement équivalent. Quoi qu'il en soit, mon +1 va à Lev Levitsky et à son argument sur l'utilisation des bibliothèques standard. De la part de Le zen de Python ...
Face à l'ambiguïté, refusez la tentation de deviner.
#!python3
import timeit
number = 10000
t = timeit.timeit('''\
for i in itertools.chain(range(30), range(2000, 5002)):
pass
''',
'import itertools', number=number)
print('itertools:', t/number * 1000000, 'microsec/one execution')
t = timeit.timeit('''\
for x in (i for j in (range(30), range(2000, 5002)) for i in j):
pass
''', number=number)
print('generator expression:', t/number * 1000000, 'microsec/one execution')
A mon avis, le itertools.chain
est plus lisible. Mais ce qui est vraiment important...
itertools: 264.4522138986938 microsec/one execution
generator expression: 785.3081048010291 microsec/one execution
... il est environ 3 fois plus rapide.