Tupel aus beliebiger Anzahl von Listen erstellen

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
wuschel
User
Beiträge: 3
Registriert: Freitag 21. Oktober 2011, 07:40

Hallo,

ich möchte eine Liste von Tupeln

Code: Alles auswählen

[(k,n), ... ,(l,m)]
mit allen möglichen Kombinationen der Elemente mehrerer Listen erstellen. Dass das recht einfach mit einer List Comprehension (LC) geht, solange ich die Anzahl der Listen kenne, habe ich bereits herausgefunden:

Code: Alles auswählen

a = [k, ... ,l]
b = [n, ... ,m]
tupels = [(i,j) for i in a for j in b] 
Meine Frage ist nun, wie ich diese "Tupel-Liste" für eine beliebige Anzahl an Listen erstelle. Zum Beispiel, wenn ich folgendes übergeben bekomme:

Code: Alles auswählen

c = [[n, ... ,m],[o, ... ,p], ... ,[y, ... ,z]]
Ich möchte daraus also eine Liste

Code: Alles auswählen

[(n,o, ... ,y), ... ,(m,p, ... ,z)]
erhalten. Ist das auch mit einer LC oder auf eine andere elegante Weise möglich?
BlackJack

@wuschel: Du suchst `itertools.product()` und möchtest in der Dokumentation zu Funktionen/Funktionsaufrufen nachlesen was der ``*`` mit Funktionsargumenten machen kann, würde ich sagen. :-)
0x1cedd1ce
User
Beiträge: 31
Registriert: Sonntag 3. Oktober 2010, 12:21

Die Listen einfach der Reihe nach miteinander verknüpfen. Erst die 1. mit der 2. dann das Ergebniss mit der 3., dann mit der 4. ...

Code: Alles auswählen

c = [[1, 2, 3], ['i', 'j', 'k'], [0.2, 0.3, 0.4], [10, 20, 30]]
if len(c) >= 1:
    result = [(i,) for i in c[0]]
    c = c[1:]
else:
    result = []
for ls in c:
    result = [i+(j,) for i in result for j in ls]
BlackJack

@0x1cedd1ce: „Einfach“ würde ich das nicht nennen wenn ich mir die Alternative mit `list()`, `itertools.product()` und `c` anschaue: ``result = list(product(*c))``. Effizienter ist das sicher auch. Und `c` ist danach immer noch an die unveränderte Liste gebunden.
wuschel
User
Beiträge: 3
Registriert: Freitag 21. Oktober 2011, 07:40

Vielen Dank für die Antworten!

Das itertools modul war genau was ich gesucht habe. Das Beispiel mit den Schleifen finde ich aber auch nicht verkehrt um einen Idee zu bekommen, wie man vorgehen kann.
Mein Problem ist soweit gelöst :) .
Antworten