2016-09-07 4 views
0

Zum Beispiel:Zuordnung der Struktur einer Liste?

A=[1,[2,3],[4,[5,6]],7] 
B=[2,3,4,5,6,7,8] 

Wie ich [2,[3,4],[5,[6,7]],8] bekommen kann?

+3

Bitte geben Sie weitere Informationen zur gewünschten Umwandlung von der Eingabe zur Ausgabe an. Wie verhält sich die Ausgabe in Ihrem Beispiel zur Eingabe? –

+0

@CraigBurgler Ich denke, das OP bedeutet, die gleichen Unterlisten wie die anderen zu kopieren, so dass die gleiche 'Struktur' (Ure) der Listen – Li357

+0

return [2, [3,4], [5, [6,7 ]], 8] – marcadian

Antwort

9

Sie eine ziemlich einfache rekursive Funktion verwenden:

def match(struct, source): 
    try: 
     return [match(i, source) for i in struct] 
    except TypeError: 
     return next(source) 

A=[1,[2,3],[4,[5,6]],7] 
B=[2,3,4,5,6,7,8] 
match(A, iter(B)) 
# [2, [3, 4], [5, [6, 7]], 8] 

Hier ist eine Version der Funktion, die ein wenig leichter sein könnte für einige Menschen zu verstehen:

def match(struct, source, index=0): 
    if isinstance(struct, list): 
     r = [] 
     for item in struct: 
      next, index = match(item, source, index) 
      r.append(next) 
     return r, index 
    else: 
     return source[index], index + 1 

A=[1,[2,3],[4,[5,6]],7] 
B=[2,3,4,5,6,7,8] 
match(A, B) 

Die Grundidee ist, um zuerst die Eingabestrukturtiefe zu durchlaufen und entsprechend Werte von der Quelle zu konsumieren. Wenn wir eine Zahl treffen, können wir einfach eine Zahl von der Quelle nehmen. Wenn wir eine Liste treffen, müssen wir diesen Algorithmus auf diese Liste anwenden. Auf dem Weg müssen Sie verfolgen, wie viele Artikel wir verbraucht haben.

Die erste Version des Algorithmus macht all dies, aber auf eine etwas andere Art und Weise. iter(B) erstellt einen Iterator, der verfolgt, wie viele Elemente aus b verbraucht wurden, und stellte das nächste Element bereit, wenn ich next(source)aufrufe, sodass ich den Index nicht explizit nachverfolgen muss. Der try/except prüft, ob ich über struct laufen kann. Wenn ich kann, wird eine Liste zurückgegeben, wenn ich nicht kann, wird der Expect-Block ausgeführt und next(source) wird zurückgegeben.

+0

Würdest du den genauen Algorithmus für jemanden erklären, der mit Python überhaupt nicht vertraut ist? Interessiert, wie du daran gedacht hast, ich programmiere leider nicht in Python. –

+0

@Bi Rico: Hrmph. Ich schrieb im Grunde die gleiche Funktion, aber überprüfte den Typ des aktuellen Eintrags, um zu entscheiden, wann ich den Tiefpunkt erreichen sollte. Dein ist kürzer und doch weniger moralisch. Sie möchten wirklich das Ende der Rekursion erkennen, indem Sie versuchen, eine Ebene mehr zu rekrutieren und eine Ausnahme zu fangen? Das ist Philosophie, nehme ich an! –

+0

das Abfangen einer Ausnahme (Duck-Typisierung) ist viel mehr Pythonic als explizite Typprüfung –

Verwandte Themen