Seite 1 von 1

Tupel aus beliebiger Anzahl von Listen erstellen

Verfasst: Freitag 21. Oktober 2011, 08:27
von wuschel
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?

Re: Tupel aus beliebiger Anzahl von Listen erstellen

Verfasst: Freitag 21. Oktober 2011, 08:55
von 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. :-)

Re: Tupel aus beliebiger Anzahl von Listen erstellen

Verfasst: Freitag 21. Oktober 2011, 09:32
von 0x1cedd1ce
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]

Re: Tupel aus beliebiger Anzahl von Listen erstellen

Verfasst: Freitag 21. Oktober 2011, 09:43
von 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.

Re: Tupel aus beliebiger Anzahl von Listen erstellen

Verfasst: Freitag 21. Oktober 2011, 10:20
von wuschel
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 :) .