Rekursiver Kombinations-Generator

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
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 7. März 2009, 21:37

Hallo,
ich möchte rekursiv alle möglichen Kombinationen eines Charsets mit einer bestimmen Anzahl an Zeichen generieren. Als Liste wäre das kein Problem, jedoch wird damit irgendwann der RAM voll, deshalb dachte ich mir, mache ich das doch als Generator. Diesen würde ich rekursiv programmieren, jedoch klappt das alles nicht so wie ich will.

Hier die Logik, Code ist bis jetzt kein nutzbarer da, darum frage ich auch.

Code: Alles auswählen

    def combinations(self, chars=''):
        if len(chars) < self.length:
            for char in self.charset:
                result = self.combinations(chars+char)
                yield result
        yield chars
Das gibt mir als Werte des Generator-Indexes immer wieder generator-Objekte, was ich aber nicht brauchen kann...

Ich bräuchte im Endeffekt eine flache Liste, welche erst bei Bedarf (d.h. Zugriff) erzeugt wird.
DasIch
User
Beiträge: 2437
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 7. März 2009, 21:47

Code: Alles auswählen

from itertools import combinations
Sollte dass fehl schlagen, steht in der Doku äquivalenter Python Code.
BlackJack

Samstag 7. März 2009, 22:02

@Dauerbaustelle: Ansonsten gibt der Aufruf von Deinem `combinations()` ja einen Generator mit den Kombinationen zurück, auch wenn Du den rekursiv aufrufst. Da musst Du dann natürlich die Ergebnisse vom rekursiven Aufruf in einer Schleife einzeln ``yield``\en und nicht den Generator selber ``yield``\en.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 7. März 2009, 22:13

@DasIch: ...und noch ein Grund mehr, Python 2.6 zu holen (wobei ich auch den Code von der Doku-Seite nehmen könnte)

@BlackJack: Ja klar, ich Depp :D

Danke vielmals euch beiden!
Antworten