Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?

Ich schrieb dies und seine Arbeit gut mit allem, aber wenn ich eine leere Liste in einer bestimmten Liste haben ( given_list=[[],1,2,3] ) es sagt, Index ist außerhalb des Bereichs. Irgendeine Hilfe?

 def r_max (given_list): largest = given_list[0] while type(largest) == type([]): largest = largest[0] for element in given_list: if type(element) == type([]): max_of_elem = r_max(element) if largest < max_of_elem: largest = max_of_elem else: # element is not a list if largest < element: largest = element return largest 

6 Solutions collect form web for “Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?”

Sie nehmen an, dass gegebene Liste mindestens 1 Element hat, das falsch ist. Um einen Index außerhalb des Bereichs zu vermeiden, können Sie hinzufügen

 if (len(given_list) == 0) return None 

Zum Anfang deiner Funktion.

Dieser Fehler zeigt an, dass Ihr Index außerhalb des Bereichs liegt, was bei dem ersten Element des Beispiels der Fall ist. Die Lösung ist nicht zu listen über Listen der Länge Null:

 def r_max (given_list): largest = given_list[0] while type(largest) == type([]): largest = largest[0] for element in given_list: if type(element) == type([]): # If the list is empty, skip if(len(elemnt) == 0) next max_of_elem = r_max(element) if largest < max_of_elem: largest = max_of_elem else: # element is not a list if largest < element: largest = element return larges 

Während du es hast, möchtest du vielleicht assert len(given_list)>0 oder etwas gleichwertiges assert len(given_list)>0 .

Wenn das Nesting willkürlich tief ist, braucht man zuerst Rekursion, um es zu entwirren:

 def items(x): if isinstance(x, list): for it in x: for y in items(it): yield y else: yield x 

Jetzt, max(items(whatever)) wird gut funktionieren.

In den letzten Versionen von Python 3 können Sie dies eleganter machen, indem Sie sich ändern

  for it in x: for y in items(x): yield y 

in:

  for it in x: yield from it 

Wenn Sie zuversichtlich sind, dass es nur eine Ebene der Nesting gibt, können Sie so etwas machen

 def r_max(lst): new_lst = [] for i in lst: try: new_lst.extend(i) except TypeError: new_lst + [i] return max(new_lst) 

Aber ich bin nicht in diese Lösung verliebt – aber es könnte Sie begeistern, um etwas Schöneres zu kommen.

Zwei Dinge, die ich gerne über diese Lösung hervorheben möchte, im Gegensatz zu deinem:

  1. Alle Typ-Checking, die du tust ( type(largest) == type([]) , etc.) gilt nicht als idiomatischer Python. Es funktioniert, aber einer der Schlüsselpunkte von Python ist, dass es Enten-Typing / EAFP fördert, was bedeutet, dass Sie sich mehr darauf konzentrieren sollten, was ein Objekt tun kann (im Gegensatz zu welcher Art es ist), und dass Sie nur versuchen sollten Zeug und erholen im Gegensatz zu herauszufinden, wenn Sie es tun können.
  2. Python hat eine ganz gute "find the most number in a list" -Funktion – max . Wenn du deine Eingabe zu einer nicht verschachtelten Liste machen kannst, dann ist max der Rest für dich.

Dies wird das Maximum in einer Liste finden, die verschachtelte Listen enthält und String-Instanzen ignoriert.

 A = [2, 4, 6, 8, [[11, 585, "tu"], 100, [9, 7]], 5, 3, "ccc", 1] def M(L): # If list is empty, return nothing if len(L) == 0: return # If the list size is one, it could be one element or a list if len(L) == 1: # If it's a list, get the maximum out of it if isinstance(L[0], list): return M(L[0]) # If it's a string, ignore it if isinstance(L[0], str): return # Else return the value else: return L[0] # If the list has more elements, find the maximum else: return max(M(L[:1]), M(L[1:])) print A print M(A) 

Padmal's BLOG

Ich gehe davon aus, dass das maximale Element einer leeren Liste eine negative Unendlichkeit ist.

Diese Annahme beschäftigt sich mit den Fällen wie [], [1,2, [], 5,4, []]

 def find_max(L): if len(L) == 0: return float("-inf") elif len(L) == 1: if isinstance(L[0], list): return find_max(L[0]) else: return L[0] elif len(L) == 2: if isinstance(L[0], list): firstMax = find_max(L[0]) else: firstMax = L[0] if isinstance(L[1], list): lastMax = find_max(L[1]) else: lastMax = L[1] if firstMax > lastMax: return firstMax else: return lastMax else: if isinstance(L[0], list): firstMax = find_max(L[0]) lastMax = find_max(L[1:]) if firstMax > lastMax: return firstMax else: return lastMax else: lastMax = find_max(L[1:]) if L[0] > lastMax: return L[0] else: return lastMax 
  • Python leer dict nicht durch Verweis übergeben?
  • Python-interpretator automatisch wiederherzustellen, ohne Antwort zurückzugeben
  • Finde alle Index mit Rekursion
  • Rekursionsfunktion funktioniert nicht richtig
  • Ist diese Funktion rekursiv, obwohl sie sich nicht nennt?
  • Trennungsliste mit Rekursion
  • Rekursiv dekrementieren eine Liste durch 1
  • Integer auf Basis-x-System mit Rekursion in Python
  • Kreuz Produkt von Sets mit Rekursion
  • Lösen von vollständig versteckten Ausdrücken mit Rekursion
  • Python rekursiv anhängen Liste Funktion
  • Python ist die beste Programmiersprache der Welt.