Der Titel ist leider nicht besonders aussagekräftig, aber mir ist nichts passendes eingefallen.
Jedenfalls:
Ich möchte gerne eine Liste folgendermaßen transformieren:
Code: Alles auswählen
[1, 2, 3, 4, 5, 6]
=>
[6, 1, 5, 2, 4, 3]
[1, 2, 3, 4, 5, 6, 7]
=>
[7, 1, 6, 2, 5, 3, 4]
umgedreht und mit dieser beginnend dann mit der ersten verzahnt; bei ungeraden Liste sollte die erste länger das "Mittelelement enthalten).
Ich habe nun zwei Varianten, die grob die beiden Algoritmen umsetzen:
(Python3)
Code: Alles auswählen
from itertools import cycle, zip_longest
from collections import deque
def iter_sestina_1(l):
yield l
while True:
l = list(item for pair in zip_longest(l[:(len(l)//2)-1:-1], l[:len(l)//2]) for item in pair if item)
yield l
def iter_sestina_2(l):
tmp = deque(l)
yield l
while True:
result = []
try:
for f in cycle((tmp.pop, tmp.popleft)):
result.append(f())
except IndexError:
yield result
tmp = deque(result)
(Inspiration für die Fragestellung: http://en.wikipedia.org/wiki/Sestina#Form )
Vielen Dank schon mal