Seite 1 von 1
Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 18:27
von Barcellona
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"]]
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 18:32
von Hyperion
Du suchst `itertools.product`.
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 20:30
von Barcellona
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
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 20:34
von cofi
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)]
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 21:12
von Barcellona
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
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?
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 21:19
von 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)
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 21:21
von Zap
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.
Re: Listen-Kombinationen
Verfasst: Mittwoch 18. Mai 2011, 21:59
von Barcellona
Ok, danke allen für die Infos!
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 08:22
von Barcellona
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?
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 08:31
von sma
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
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 08:31
von /me
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)
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 09:19
von Barcellona
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
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 09:30
von 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?
Re: Listen-Kombinationen
Verfasst: Donnerstag 19. Mai 2011, 09:34
von Leonidas
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.