2016-08-19 1 views
-1

Die Liste tiefer sein kann, oder flacher, aber ich habe eine Liste der Tiefe 2 haben, wie folgt:Append Elemente eines willkürlich verschachtelt Liste in einer Tiefensuche-artige Weise ohne Rekursion

a = [['a','b'],['c','d'],['e','f']] 

I wollen eine Funktion schreiben, f(a), so dass sie die folgende neue Liste zurückkehren würde:

['acef', 'adef', 'bcef', 'bdef'] 

ich imitiert Tiefensuche, wo die Listen Knoten sind im Wesentlichen. Ich möchte, dass die Funktion mit depth = n arbeitet, wobei n eine beliebige ganze Zahl ist. Was ist der pythischste Weg, dies zu erreichen?

Mein rekursiven Code lautet wie folgt:

def f(elems): 
    curr, *rest = elems 

    if not rest: 
     return ''.join(curr) 

    ret = [''.join(x + f(rest)) for x in curr] 
    return ret 

Wie würde ich mich über diese iterativ zu lösen?

+2

Ihr Ausgang ist keine gültige Python-Datenstruktur. Und warum sieht es so aus, als ob die Liste "['e],' f '' 'eine spezielle Behandlung erhält? Und verwenden Sie "Tiefe", um sich auf die Länge zu beziehen? – user2357112

+0

Das sieht aus wie alle Kombinationen aus den Elementen außer dem letzten und verketten dann die Elemente des letzten. Nicht sicher, ob das, was du Algorithmus bist, völlig klar ist. (Aber wenn es wäre, hättest du wahrscheinlich die Lösung) – Anthon

+0

@ user2357112 oh ich sehe was du meinst. Es ist ein modifiziertes DFS, so dass das letzte Element immer alle Elemente zusammenfügt. Ja Tiefe = Länge – ifma

Antwort

1

können Sie itertools.product verwenden:

import itertools 

def f(elems): 
    *branches, leaves = elems 
    for path in itertools.product(*branches): 
     yield ''.join(itertools.chain(path, leaves)) 

a = [['a','b'],['c','d'],['e','f']] 
print(list(f(a))) 

Das gibt:

['acef', 'adef', 'bcef', 'bdef'] 
Verwandte Themen