unbestimmte Anzahl an Iteratoren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Vannid Burdon
User
Beiträge: 12
Registriert: Freitag 22. Dezember 2006, 14:51

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.
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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Suchst du sowas?

Code: Alles auswählen

from itertools import izip
def test(*iteratoren):
    for item in izip(*iteratoren):
        yield item
Gruss
Vannid Burdon
User
Beiträge: 12
Registriert: Freitag 22. Dezember 2006, 14:51

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Kann es sein dass du aus 3 Mengen eigentlich einfach alle Permutationen willst?

Gruss
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

So wie ich das verstanden hab, nicht aus 3, sondern n Mengen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Vannid Burdon
User
Beiträge: 12
Registriert: Freitag 22. Dezember 2006, 14:51

Danke euch und besonders Birkenfeld. Das war was ich gesucht habe :)
Antworten