cycle
entre l'obtention d'éléments de l'avant iter
et le reversed
un. Assurez-vous juste de vous arrêter à len(a)
avec islice
.
from itertools import islice, cycle
iters = cycle((iter(a), reversed(a)))
b = [next(it) for it in islice(iters, len(a))]
>>> b
[0, 9, 1, 8, 2, 7, 3, 6, 4, 5]
Cela peut facilement être mis en une seule ligne, mais cela devient alors beaucoup plus difficile à lire :
[next(it) for it in islice(cycle((iter(a),reversed(a))),len(a))]
Le fait de le mettre sur une seule ligne vous empêcherait également d'utiliser l'autre moitié des itérateurs si vous le souhaitiez :
>>> iters = cycle((iter(a), reversed(a)))
>>> [next(it) for it in islice(iters, len(a))]
[0, 9, 1, 8, 2, 7, 3, 6, 4, 5]
>>> [next(it) for it in islice(iters, len(a))]
[5, 4, 6, 3, 7, 2, 8, 1, 9, 0]
1 votes
Pourquoi pas deque ?!
l1=list(range(10)); d1=deque(l1); [d1.pop() if i%2 else d1.popleft() for i,_ in enumerate(l1) if d1]