Seite 1 von 1
unbestimmte Anzahl an Iteratoren
Verfasst: Donnerstag 18. Januar 2007, 02:49
von Vannid Burdon
Wie kann ich eine unbestimmte Anzahl an Iteratoren nacheinander auslaufen lassen?
Beispiel: Bestimmte Anzahl
Code: Alles auswählen
for it1 in iterator1:
item1 = it1.next()
for it2 in iterator2:
item2 = it2.next()
for it3 in iterator3:
item3 = it3.next()
yield (item1, item2, item3)
Bisher habe ich die drei Iteratoren in eine Liste platziert und mit itertools.cycle() iteriert, jedoch bekomme ich dort nicht das gewünschte Ergebnis. Mein gewünschtes Ergebnis wäre das Beispiel von oben, jedoch mit der Möglichkeit, eine unbestimmte Anzahl an Iterator Objekten zu nutzen. Es ist/soll kein Bruteforce Algorythmus sein. Mein zweiter Gedanke war eine Rekursion aber mein Gehirn machte, in Verbindung mit dem yield, schlapp. Bestimmt geht das wieder ganz einfach und mir kann evtl. hier einer helfen.
Danke im voraus.
Verfasst: Donnerstag 18. Januar 2007, 10:05
von BlackJack
Könntest Du mal ein Beispiel bringen. Also ein echtes, das Du auch ausprobiert hast. Bei dem da oben bin ich mir nämlich fast sicher, dass es nicht das tut was Du möchtest. Und mit konkreten Beispiel-Ein- und -Ausgaben bitte.
Verfasst: Donnerstag 18. Januar 2007, 12:40
von rayo
Hi
Suchst du sowas?
Code: Alles auswählen
from itertools import izip
def test(*iteratoren):
for item in izip(*iteratoren):
yield item
Gruss
Verfasst: Donnerstag 18. Januar 2007, 14:01
von Vannid Burdon
Sorry, hatte das Beispiel etwas falsch aufgebaut.
Code: Alles auswählen
from itertools import izip
def a():
for i in xrange(1,10,1): yield i
def b():
for i in xrange(1,10,1): yield i
def c():
for i in xrange(1,10,1):
yield i
liste = []
liste.append(a())
liste.append(b())
liste.append(c())
def test1(*liste):
for item in izip(*liste):
yield item
def test2():
for it1 in a():
for it2 in b():
for it3 in c():
yield (it1, it2, it3)
#for i in test1(*liste): print i
for i in test2(): print i
Also ich muss glaube die test2() rekursiv aufbauen, weiss aber nicht wie ich dann mit dem yield umgehen muss.
Verfasst: Donnerstag 18. Januar 2007, 14:46
von birkenfeld
Suchst du das hier?
Code: Alles auswählen
def multiiter(*iters):
if len(iters) == 1:
for x in iters[0]:
yield (x,)
else:
tails = list(multiiter(*iters[1:]))
for head in iters[0]:
for tail in tails:
yield (head,) + tail
for x in multiiter(xrange(5), xrange(5, 10), xrange(10, 15)):
print x
Wenn die "iters" Iterables sind, über die man mehrmals iterieren kann, kann man den Zwischenschritt über "tails" auch weglassen und gleich "for y in multiiter(...)" schreiben.
Verfasst: Donnerstag 18. Januar 2007, 15:08
von rayo
Hi
Kann es sein dass du aus 3 Mengen eigentlich einfach alle Permutationen willst?
Gruss
Verfasst: Donnerstag 18. Januar 2007, 15:20
von birkenfeld
So wie ich das verstanden hab, nicht aus 3, sondern n Mengen.
Verfasst: Donnerstag 18. Januar 2007, 15:41
von Vannid Burdon
Danke euch und besonders Birkenfeld. Das war was ich gesucht habe
