Listen-Kombinationen

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
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Hallo zusammen,

hätte mal eine Frage.

Und zwar habe ich eine Liste (Array), die aus weiteren Listen besteht.
In etwa so: [["ich","du"],["reden","laufen","denken"],["schnell","langsam"]]

Und müsste jetzt eine Funktion schreiben, die mir alle möglichen Kombinationen zusammensetzt.

Also Output: [["ich","reden","schnell"],["ich","laufen","schnell"],["ich","denken","schnell"]],etc.]
Aus jeder Liste muss ein Element enthalten sein, alle Kombinationen.

Kann mir jemand weiterhelfen?

Code: Alles auswählen

def get_combinations(word_list):
    word_list=[["ich","du"],["reden","laufen","denken"],["schnell","langsam"]]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du suchst `itertools.product`.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Danke Hyperion, scheint mir die Lösung zu sein...

Leider bekomme ich beim Benutzen von itertools.product() ein "itertools.product object" als
Ergebnis und nicht die Liste der Kombinationen, die ich brauche.

Weiß jemand, wie ich dem Objekt die Ergebnisse entnehmen kann? :K
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Behold: Rocket science!

Code: Alles auswählen

In [1]: import itertools

In [2]: itertools.product((1,2,3), (4,5,6))
Out[2]: <itertools.product object at 0x27844b0>

In [3]: list(_)
Out[3]: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Danke, verstehe die "Rocket Science" aber noch nicht so ganz.

Wenn ich das Ganze in der Python-Konsole eingebe, klappt es.

Wenn ich es allerdings in mein Skript einfüge, gibt mir

Code: Alles auswählen

list(_)
eine Fehlermeldung (global name "_" is not defined)

Was genau bedeutet denn der Befehl "list(_)" und wieso funktioniert er im Skript wohl nicht?
Bzw. was muss ich im Skript ändern, um das Ergebnis der Funktion product() zu sehen?
lunar

Im interaktiven Interpreter wird das Ergebnis einer Eingabe immer automatisch an den Namen "_" gebunden, damit man einfach auf das Ergebnis der vorherigen Zeile zugreifen muss. In normalem Quelltext geschieht das natürlich nicht automatisch, dort musst Du das Ergebnis explizit an einen Namen binden:

Code: Alles auswählen

l = list(itertools.product((1,2,3), (4,5,6)))
print(l)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

cofi benutzt eine interaktive Konsole namens IPython. Und dort kann man allem anschein nach mit '_' auf das vorherige Ergebnis zurückgreifen.
Die wichtige Info die dir fehlt: Ein solches product Objekt ist iterierbar. Mit dem aufruf von list() auf das product Objekt bekommst du eine Liste.
Es ist allerding oft gar nicht notwendig eine Liste erzeugen zu müssen. In der Regel reicht es ein solches Objekt in der nächsten 'for'-Schleife zu verwenden.

Edit: Ach das mit dem _ geht auch in der interaktiven Shell von Python. Sieh an, hab ich noch nicht gewusst. Kannte nur von IPython die Möglichkeit auf das Ergebnis via Zeilennummer zuzugreifen.
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Ok, danke allen für die Infos!
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Müsste leider noch einmal etwas fragen...

Und zwar hab' ich das Problem, dass meine Daten in Listen aufgeteilt sind, welche wiederum alle in einer Liste liegen.

So in etwa: [["Ich","Du"],["laufen","reden","denken"],["schnell","langsam"],[".","!"]]
# Pos 1 Pos 2 Pos3 Pos4

Wie viele Listen sich in der großen Liste befinden ist variabel (je nach Satzlänge).

itertools.product() müsste ich nun als Argument die einzelnen Listen übergeben, nicht aber alles in einer großen Liste.
Das Problem ist aber, dass die Länge der großen Liste ja variabel ist, und ich somit nicht fixe Listen für jede Position erstellen kann...
Normalerweise greife ich einfach mit "for pos in gr_liste:" auf jede einzelne Liste zu, aber so kann ich ja nicht die Listen an
itertools.product() übergeben... :(
Hat jemand eine Idee?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich nehme doch an, dass das eine Hausaufgabe ist, da diese Produktbildung ein typisches Beispiel für einen rekursiven teile-und-herrsche-Algorithmus ist, der zum "Grundwortschatz" eines Softwerkers gehören sollte.

Hier mal eine Lösung als Generator:

Code: Alles auswählen

def product(list_of_lists):
    if list_of_lists:
        for word in list_of_lists[0]:
            for list in product(list_of_lists[1:]):
                yield [word] + list
    else:
        yield []

for list in product([["ich","du"],["reden","laufen","denken"],["schnell","langsam"]]):
    print list
Stefan
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Barcellona hat geschrieben:itertools.product() müsste ich nun als Argument die einzelnen Listen übergeben, nicht aber alles in einer großen Liste.
Das Problem ist aber, dass die Länge der großen Liste ja variabel ist, und ich somit nicht fixe Listen für jede Position erstellen kann...
Normalerweise greife ich einfach mit "for pos in gr_liste:" auf jede einzelne Liste zu, aber so kann ich ja nicht die Listen an
itertools.product() übergeben... :(
Hat jemand eine Idee?
Ja. Wir lassen Python die Liste auspacken.

Code: Alles auswählen

from itertools import product

foo = [['Ich', 'Du'], ['gehen', 'laufen', 'schleichen'], ['Hause', 'Lager']]
bar = product(*foo)
print list(bar)
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Danke, klappt.

Ist übrigens keine Hausaufgabe, habe allerdings auch nicht Informatik studiert, sondern bringe mir das mehr selbst bei.

Den * zum Auspacken der Liste kannte ich leider noch nicht :(

Kann mir jemand sagen, wie der heißt oder nach welchem Thema ich suchen muss? Um mal im Buch nachschlagen zu können...

Danke
lunar

Mal am Rande: Woher kommt eigentlich dieses Gerücht, man müsste Informatik studieren, um Programmieren zu können oder gar zu dürfen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich würde es mal als "unpacking" bezeichnen, in Lisp wird sowas ähnliches als "unsplicing" bezeichnet.

@lunar: vielleicht weil man denkt dass man im Informatik-Studium Programmieren lernt. Kann ich, wenn ich viele meiner Komillitonen ansehe und/oder meiner Vorlesungen ansehe eigentlich gar nicht bestätigen. Die die vorher Programmieren konnten, konnten es erstaunlicherweise danach immer noch, die die es nicht konnten können das oftmals danach nicht besonders gut. Also da sollte man sich als "Hobbyprogrammierer" nicht runterwerten, denn guter Programmierer wird man wenn man sich da reinhängt, nicht weil man Zeit in der Uni absitzt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten