Seite 1 von 1
Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:03
von burli
Hi, ich möchte Listen, die in einer Liste gespeichert sind, rekursiv durchlaufen
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
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:10
von cofi
Und wie sollen die neuen Listen aus den alten gebildet werden?
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:14
von burli
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
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:17
von burli
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
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:23
von sma
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
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:30
von burli
Dickes Dickes Dickes DANKE
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:40
von burli
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.
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 18:50
von 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">']
Re: Listen in Liste rekursiv durchlaufen
Verfasst: Mittwoch 12. Januar 2011, 19:25
von burli
@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!!