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 :)