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

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

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!!