Listen in Liste rekursiv durchlaufen

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
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi, ich möchte Listen, die in einer Liste gespeichert sind, rekursiv durchlaufen

Code: Alles auswählen

[['1','2'],
['3','4','5'],
['2']]
Als Ergebnis soll wieder eine Liste mit Listen rauskommen, die dann etwa so aussieht

Code: Alles auswählen

[['1','3','2'],
['2','3','2'],
['1','4','2'],
['2','4','2'],
['1','5','2'],
['2','5','2']]
Aber ich beiße mir gerade daran die Zähne aus. Könnt ihr mir da weiterhelfen? Zahl und Länge der Listen kann variieren
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und wie sollen die neuen Listen aus den alten gebildet werden?
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

cofi hat geschrieben:Und wie sollen die neuen Listen aus den alten gebildet werden?
Das versuche ich ja gerade rauszufinden. Mit Rekursion dürfte das gehen. Ich weiß nur nicht, wie
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich sehe gerade, dass ich die neue Liste vermutlich falsch sortiert habe. Wenn ich mich nicht irre müsste die Liste so aussehen

Code: Alles auswählen

[['1','3','2'],
['1','4','2'],
['1','5','2'],
['2','3','2'],
['2','4','2'],
['2','5','2']]
Im Endeffekt spielt es aber keine Rolle
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

l = [['1','2'], ['3','4','5'], ['2']]

def permutate(l):
    if len(l) == 1:
        return l
    r = []
    for e2 in permutate(l[1:]):
        for e1 in l[0]:
            r.append([e1] + e2)
    return r

print(permutate(l))
Stefan
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Dickes Dickes Dickes DANKE
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hm, da stimmt etwas nicht. Die letzte Liste hängt er in voller Länge an jede Ergebnisliste, statt sie zu durchlaufen.

Das geht rein:

Code: Alles auswählen

[<Tag "DIP">]
[<Tag "ATmega32">, <Tag "ATmega324">, <Tag "ATxmega32A4">]
[<Tag "AVR">, <Tag "AVR32">, <Tag "megaAVR">, <Tag "tinyAVR">]
und das kommt raus.

Code: Alles auswählen

[<Tag "DIP">, <Tag "ATmega32">, <Tag "AVR">, <Tag "AVR32">, <Tag "megaAVR">, <Tag "tinyAVR">]
[<Tag "DIP">, <Tag "ATmega324">, <Tag "AVR">, <Tag "AVR32">, <Tag "megaAVR">, <Tag "tinyAVR">]
[<Tag "DIP">, <Tag "ATxmega32A4">, <Tag "AVR">, <Tag "AVR32">, <Tag "megaAVR">, <Tag "tinyAVR">]
Es müssten aber 12 Listen mit jeweils 3 Einträgen sein, wenn ich mich in dem Beispiel nicht verrechnet habe

EDIT
Ich habe mal das Ergebnis zusammengebastelt, das heraus kommen soll

Code: Alles auswählen

[<Tag "DIP">, <Tag "ATmega32">, <Tag "AVR">]
[<Tag "DIP">, <Tag "ATmega32">, <Tag "AVR32">]
[<Tag "DIP">, <Tag "ATmega32">, <Tag "megaAVR">]
[<Tag "DIP">, <Tag "ATmega32">, <Tag "tinyAVR">]
[<Tag "DIP">, <Tag "ATmega324">, <Tag "AVR">]
[<Tag "DIP">, <Tag "ATmega324">, <Tag "AVR32">]
[<Tag "DIP">, <Tag "ATmega324">, <Tag "megaAVR">]
[<Tag "DIP">, <Tag "ATmega324">, <Tag "tinyAVR">]
[<Tag "DIP">, <Tag "ATxmega32A4">, <Tag "AVR">]
[<Tag "DIP">, <Tag "ATxmega32A4">, <Tag "AVR32">]
[<Tag "DIP">, <Tag "ATxmega32A4">, <Tag "megaAVR">]
[<Tag "DIP">, <Tag "ATxmega32A4">, <Tag "tinyAVR">]
In deinem Beispiel müssten als Ergebnis auch 6 Listen mit je 3 Einträgen rauskommen.
Zuletzt geändert von burli am Mittwoch 12. Januar 2011, 18:50, insgesamt 1-mal geändert.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
BlackJack

@burli: Kann es sein, dass Du `itertools.product()` suchst!?

Code: Alles auswählen

In [275]: data
Out[275]: [['1', '2'], ['3', '4', '5'], ['2']]

In [276]: list(itertools.product(*data))
Out[276]: 
[('1', '3', '2'),
 ('1', '4', '2'),
 ('1', '5', '2'),
 ('2', '3', '2'),
 ('2', '4', '2'),
 ('2', '5', '2')]
Und:

Code: Alles auswählen

In [281]: x = list(itertools.product(a, b, c))

In [282]: len(x)
Out[282]: 12

In [283]: x
Out[283]: 
[('<Tag "DIP">', '<Tag "ATmega32">', '<Tag "AVR">'),
 ('<Tag "DIP">', '<Tag "ATmega32">', '<Tag "AVR32">'),
 ('<Tag "DIP">', '<Tag "ATmega32">', '<Tag "megaAVR">'),
 ('<Tag "DIP">', '<Tag "ATmega32">', '<Tag "tinyAVR">'),
 ('<Tag "DIP">', '<Tag "ATmega324">', '<Tag "AVR">'),
 ('<Tag "DIP">', '<Tag "ATmega324">', '<Tag "AVR32">'),
 ('<Tag "DIP">', '<Tag "ATmega324">', '<Tag "megaAVR">'),
 ('<Tag "DIP">', '<Tag "ATmega324">', '<Tag "tinyAVR">'),
 ('<Tag "DIP">', '<Tag "ATxmega32A4">', '<Tag "AVR">'),
 ('<Tag "DIP">', '<Tag "ATxmega32A4">', '<Tag "AVR32">'),
 ('<Tag "DIP">', '<Tag "ATxmega32A4">', '<Tag "megaAVR">'),
 ('<Tag "DIP">', '<Tag "ATxmega32A4">', '<Tag "tinyAVR">')]

In [284]: a
Out[284]: ['<Tag "DIP">']

In [285]: b
Out[285]: ['<Tag "ATmega32">', '<Tag "ATmega324">', '<Tag "ATxmega32A4">']

In [286]: c
Out[286]: ['<Tag "AVR">', '<Tag "AVR32">', '<Tag "megaAVR">', '<Tag "tinyAVR">']
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

@BlackJack: Perfekt. Liefert zwar Tuple, aber das ist wurscht. Werd mir Itertools gleich mal näher anschauen. Schätze, dass kann ich öfter gebrauchen.

Danke!!
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Antworten