2016-09-12 5 views
2

Ich habe gerade Python als meine erste Programmiersprache gelernt. Bei einer Liste mit vielen möglichen Unterlisten, die eine variable Anzahl von Elementen haben, gibt es eine Möglichkeit, regex (oder etwas Ähnliches) zu verwenden, um zu bestimmen, welche Listen Unterlisten mit 1) der Anzahl der angegebenen Elemente und 2) einer gegebenen enthalten Art des Inhalts in einer bestimmten Reihenfolge (einschließlich anderer Unterlisten)? Zum Beispiel (in Pseudo-Code):Suche nach generischen Unterlisten innerhalb einer Liste

list1 = [1, 4, 7, ["a", 5, "b"], 2, 4,7,"k",9] 
list2 = [1, 4, 7, ["a", "h", "b"], 2] 
list3 = [1, 4, 7, ["a", ["a", 6, "b"], "b"], 5, 3] 

list4 = [1, 4, 7, ["a", "b"], 3, 4] 
list5 = [1, 4, 7, ["a", 5, "b", 7], 3, 4] 

if ["a", ., "b"] in listx: # where "." stands for anything, even sub-lists 
    print("yes") 
else: 
    print("no") 

list1, list2 und list3 sollten "Ja" drucken, aber list4 und list5 sollten "nein" drucken.

Als Bonus gibt es eine Möglichkeit, 1) die Anzahl, wie oft die angegebene generische Unterliste gefunden wurde, und 2) wo? Zum Beispiel, list3 return "Es gibt 2 [" a ",.," B "] Unterlisten, die list3 [3] und list3 [3] [1]"

Ich weiß, ich könnte konvertieren Ganze zu einem String und parsen es, aber das scheint nicht eine sehr elegante oder effiziente Lösung. Vielen Dank!

+0

Meine Vermutung ist, dass Rekursion ein helfen würde, viel ... ist das Hausaufgaben? – daveydave400

+1

Keine Hausaufgaben. Nur ein Doktorand in einem anderen Bereich versucht, ihre Fähigkeiten zu erweitern. – amateur3057

Antwort

3

Ich stimme zu, dass die Umwandlung in eine Zeichenfolge hier keinen Sinn ergibt, aber reguläre Ausdrücke suchen explizit nach Zeichenfolgen, sodass Sie auch nicht danach suchen. Sie suchen eine rekursive Lösung, die für Ihre Regeln prüft, welche (im wesentlichen)

somelist ist oder enthält eine Liste, die mit der Zeichenfolge „a“, endet mit der Zeichenfolge „b“ beginnt, und hat drei oder mehr Elemente.

Codify dass in:

def flat_pass(lst): 
    return len(lst) >= 3 and lst[0] == 'a' and lst[-1] == 'b' 

Jetzt müssen Sie nur noch Rekursion (die fangen an „ENTHÄLT“ Teil der oben genannten Regeln)

def recurse_pass(lst): 
    if len(lst) >= 3 and lst[0] == 'a' and lst[-1] == 'b': 
     # base case 
     return True 
    # otherwise, flow continues... 
    for el in lst: 
     if isinstance(el, list): 
      # recursive case 
      if recurse_pass(el): 
       return True 
    return False 
+1

Vielen Dank für die Hilfe! Unglücklicherweise dachte ich, es wäre ziemlich einfach, den Code zu ändern, den man gab, um die Anzahl der Male zurückzugeben, die die Unterliste in der ursprünglichen Liste erscheint und wo (der Bonus in der ursprünglichen Frage), aber bis jetzt habe ich nicht war in der Lage, eine Lösung zu finden, die funktioniert. Ich konnte hier einen ähnlichen Thread mit einer möglichen Lösung finden (http://stackoverflow.com/questions/13205875/add-an-item-into-a-list-recursively), aber aus irgendeinem Grund bin ich nicht in der Lage damit es für meinen Fall funktioniert. – amateur3057

Verwandte Themen