2016-07-13 22 views
1

Ich habe die exakt gleiche Funktionalität mit Rekursionen implementiert, ich möchte auch eine Version ohne Rekursion, da Python ein Rekursionslimit hat und Probleme beim Teilen von Daten auftreten.Rekursives Ersetzen von Elementen in einer Liste durch Elemente einer anderen Liste

sublist2 = [{'nothing': "Notice This"}] 
sublist1 = [{'include':[sublist2]}] 

mainlist = [{'nothing': 1}, {'include':[sublist1, sublist2]}, 
      {'nothing': 2}, {'include':[sublist2]}] 

Was ist in der Todo zu füllen?

for i in mainlist: 
    if 'nothing' in i: 
     # Do nothing 
    else if 'include' in i: 
     # Todo 
     # Append the contents of the list mentioned recursively 
     # in it's own place without disrupting the flow 

Nach der Operation das erwartete Ergebnis

mainlist = [{'nothing': 1}, 
      {'nothing': "Notice This"}, {'nothing': "Notice This"}, 
      {'nothing':2}, 
      {'nothing': "Notice This"}] 

Wenn Sie sublist1 Verweise auf sublist2 bemerken. Das ist der Grund

{ 'schließen': [sublist1, sublist2]} wird ersetzt durch

{ 'nichts': "Hinweis Dieses"}, { 'nichts': "Hinweis Dieses"}

ich habe die folgenden versucht

Inserting values into specific locations in a list in Python

How to get item's position in a list?

+1

Ich bin verwirrt zu einer Scheibe zuweisen. Willst du das rekursiv machen oder nicht? Ihr erster Absatz und Titel widersprechen einander. – Jokab

+0

Sie haben Recht, dass Python Rekursionsbegrenzungen hat (standardmäßig 1000), aber wenn Ihre Datenstruktur das kaputt macht, dann würde ich sagen, dass etwas ernsthaft mit Ihren Daten nicht stimmt. –

+0

@Jokab Ich meinte die Liste sollte rekursiv bevölkern. Ich möchte keine Rekursionen verwenden. Wird es korrigieren –

Antwort

2

Statt Rekursion verwenden, können Sie bei der n-ten Element anschauen und ändern an Ort und Stelle, bis es keine weitere Verarbeitung benötigt.

sublist2 = [{'nothing': "Notice This"}] 
sublist1 = [{'include':[sublist2]}] 

mainlist = [{'nothing': 1}, {'include':[sublist1, sublist2]}, 
      {'nothing': 2}, {'include':[sublist2]}] 

index = 0 
while index < len(mainlist): 
    if 'nothing' in mainlist[index]: 
     index += 1 
    elif 'include' in mainlist[index]: 
     # replace the 'include' entries with their corresponding list 
     mainlist[index:index+1] = mainlist[index]['include'] 
    elif isinstance(mainlist[index], list): 
     # if an entry is a list, replace it with its entries 
     mainlist[index:index+1] = mainlist[index] 

Hinweis der Unterschied zwischen l[0] zu einem Eintrag zuweisen und l[0:1]

>>> l = [1, 2, 3, 4] 
>>> l[3] = ['a', 'b', 'c'] 
>>> l 
[1, 2, 3, ['a', 'b', 'c']] 
>>> l[0:1] = ['x', 'y', 'z'] 
>>> l 
>>> ['x', 'y', 'z', 2, 3, ['a', 'b', 'c']] 
Verwandte Themen