2017-01-18 2 views
1

Ich habe versucht, dieses Problem zu beheben, aber die gleiche Fehlermeldung kam jedes Mal nach oben:Indexerror: Listenindex mit einer while-Schleife außerhalb des Bereichs

while number_list[i] <= number_list[j]:

IndexError: list index out of range

ich für die gleiche Art von Fehlern gesucht habe, aber nicht sehr ähnliche Fälle gefunden.

Hier ist der Kopf Programm (Aufträge der Nummern meiner Liste, von den Kleinen zu dem größeren):

number_list=[] 

list_lenght=int(input("List lenght: ")) 

while len(number_list)<list_lenght: 
    item=input("Enter new item to the list:") 
    number_list.append(item) 
    print(number_list) 

print("That's your number list: ",number_list) 

number_list_final=[] 

def order_number_list(number_list): 
    i=0 
    j=1 
    while (j)<=(len(number_list)-1): 
     while number_list[i]<=number_list[j]: 
      j=j+1 
     i=j 
     j=i+1 
    final_item=number_list[i] 
    number_list_final.append(final_item)` 
    del number_list[i] 
    order_number_list(number_list) 

order_number_list(number_list) 
print(number_list_final) 

Ich weiß, das ist mit der Liste zu iterieren, während es zu ändern, aber keine Ahnung wie man es repariert.

Kann mir jemand helfen, das zu debuggen, oder mir ein paar Tipps geben?

Vielen Dank!

+0

Das ist nicht der Schlüssel, meine ich. Der Fehler ist in der nächsten Zeile, wie ich schon sagte. –

+0

Gibt es einen Grund, warum Sie 'sorted (numbers_list)' nicht verwenden? –

Antwort

0
number_list=[] 

list_lenght=int(input("List length: ")) 

while len(number_list)<list_lenght: 
    item=input("Enter new item to the list:") 
    number_list.append(int(item)) 
    print(number_list) 

print("That's your number list: ",number_list) 

number_list_final=[] 

def order_number_list(number_list): 
    current_low = ["number"] 
    current_low[0] = number_list[0] 
    x = 1 
    current_low_pos = 0 
    while x < len(number_list): 
     if current_low[0] > number_list[x]: 
      current_low[0] = number_list[x] 
      current_low_pos = x 
     x = x + 1 
    del number_list[current_low_pos] 

    if number_list == []: 
     remaining_list = [] 
    else: 
     remaining_list = order_number_list(number_list) 

    return (current_low + remaining_list) 
number_list_final = order_number_list(number_list) 
print(number_list_final) 

existieren doesnt Dies ist Code, der geklärt und korrigiert wurde. j hat nicht richtig funktioniert, wie andere Antworten darauf hingewiesen haben.

number_list.append(item) 

muß geändert werden:

number_list.append(int(item)) 

weil Sie Strings mit dem '<' Operator vergleichen können nicht.

Ich habe auch eine return-Anweisung, hinzugefügt, um diese Codezeile:

number_list_final = order_number_list(number_list) 

weil der endgültigen Druck Anweisung würde eine leere Liste drucken, weil:

order_number_list(number_list) 

nicht die Variable number_list_final ändern .

Ich habe einen Teil des Funktionscodes einfach geändert und lesbarer gemacht.

Es legt auch explizit das aktuell niedrigste Element als erstes fest und ändert das, wenn später ein niedrigeres Element gefunden wird.

Ich hoffe, dies hilft, lassen Sie mich wissen, wenn Sie Fragen haben!

+0

Endlich! Thak du, ich werde die neuen Zeilen checken und mit meinen vergleichen. Was ich nicht verstehen kann ist: Warum sollte ich folgendes verwenden: number_list.append (int (item)) wenn ich die Listeneingaben mit int (input()) eingeführt habe? –

+0

@GonzaloMolina Sie haben nur int (input()) auf der Eingabe für die Listenlänge verwendet, nicht für jedes einzelne Element in der Liste. schau auf den ursprünglichen Code in der Frage zurück, die einzige Verwendung von int() auf einer Eingabe war für die Länge der Liste, nicht jedes Element in der Liste. – ANVGJSENGRDG

+0

Vielen Dank und Entschuldigung für die Störung mit so einfachen Zweifeln. nur wenige erinnernde Zweifel: Warum setzen wir "Zahlen" hinein -> current_flow = []? und ich verstehe nicht die las ** if ** und ** else ** ustainments. –

0

Wenn ich Sie richtig verstehe, versuchen Sie, eine Liste von Zahlen zu sortieren. Dafür gibt es eine integrierte Python-Methode, die seit Jahren dafür optimiert wurde, schnell zu sein und wenig Speicher zu verbrauchen. Sie heißt sorted.

Statt order_number_list laufen, versuchen:

print(sorted(number_list)) 

Wenn dies eine Art von Hausaufgaben ist, und Sie sind nicht für pädagogische Zwecke verwenden, die sich im internen sorted, ließ ich würde Ihnen empfehlen, eine zu verwenden, Sortieralgorithmus namens Blasensortierung, weitere Informationen hier - Bubble Sort Homework.

+0

Ich stelle mir vor, dass dies eine Hausaufgabe für OP ist, in der sie keine eingebauten "sortierten" verwenden können. – blacksite

+0

Ich kenne die Existenz von Einbauten, aber da ich mit Python beginne, würde ich lieber das Programm Schritt für Schritt entwickeln. Ich möchte eine Liste von Nummern von der Kleinen zum Größeren bestellen. Ich führe die Liste manuell ein und bewerte sie dann mit der Funktion ** order_number_list **. Also, zuerst mache ich ** während ** Schleife, um jeden Index mit jedem bis zum letzten zu vergleichen. Dann, wenn man als der Kleine erkannt wird, lösche ich es mit der Anweisung ** del ** aus der ursprünglichen Liste und speichere es in der neuen Liste mit ** append **. –

+0

@GonzaloMolina, das ist kein sehr effizienter Sortieralgorithmus, und würde wahrscheinlich weniger Buggy sein, wenn Sie for-Schleifen verwenden. 'while'-Schleifen werden im Allgemeinen sparsam verwendet, wenn Sie lernen möchten, wie Python normalerweise verwendet wird. –

0

Wenn Sie Ihren Code aktualisieren, um einige Druckanweisungen zu enthalten, wird angezeigt, dass der Wert j über die Länge der Liste hinausgeht. Dann kann die "while number_list [i] < = number_list [j]:" nicht mehr vervollständigt werden, da es für den j-Wert keine "number_list [j]" gibt.

number_list=[1,2,3,4,5] 

list_lenght=5 
#=int(input("List lenght: ")) 

#while len(number_list)<list_lenght: 
# item=input("Enter new item to the list:") 
# number_list.append(item) 
# print(number_list) 

print("That's your number list: ",number_list) 

number_list_final=[] 

def order_number_list(number_list): 
    i=0 
    j=1 
    while (j)<=(len(number_list)): 
     while number_list[i]<=number_list[j]: 
      print (j) 
      print (i) 
      j=j+1 
     i=j 
     j=i+1 
    final_item=number_list[i] 
    number_list_final.append(final_item) 
    del number_list[i] 
    order_number_list(number_list) 

order_number_list(number_list) 
print(number_list_final) 

Diese Ausgänge:

That's your number list: [1, 2, 3, 4, 5] 
1 
0 
2 
0 
3 
0 
4 
0 
Traceback (most recent call last): 
    File "C:/Python3/numberlist.py", line 30, in <module> 
    order_number_list(number_list) 
    File "C:/Python3/numberlist.py", line 19, in order_number_list 
    while number_list[i]<=number_list[j]: 
IndexError: list index out of range 

Der Code wird Umfallen einmal j 5 für dieses Beispiel ist, es in eine Zahl zu vergleichen versucht, die

+0

Ich verstehe überhaupt nicht, was Sie meinen, aber, wenn Sie eine Liste mit 5 Zahlen haben, existiert Liste [5]. und da ich ** del ** verwende, um die alte Liste zu ändern, wird die neue mit seiner neuen Länge ausgewertet. –

+0

Python-Labels beginnen bei 0. Das erste Element in der Liste Python ruft 0. Wenn Sie im obigen Beispiel (number_list [j]) drucken, wenn j = 0, wird "1" gedruckt. – CodeCupboard

+0

Ich weiß, wie die Listenbezeichnungen funktionieren, aber mit dieser Aussage sagst du mir nichts. Aber weise, danke. –

Verwandte Themen