2016-11-23 5 views
0
x=int(input("limit")) 
n=[] 
for i in range (x): 
k=input("number to add") 
n.append(k) 
print "to pop the multiples of five" 
print n 
for no in n: 
if (no%5==0): 
    n.pop(no) 

print n 

ich pop Indexbereich aus, aber soweit ich überprüfen, es ist kein Fehler ist .. bitte helfen Sie mir, schnellFehler: Index außerhalb des zulässigen Bereichs

+1

Sie ändern den gleichen Container, über den Sie gerade iterieren. Dies ist in der Regel ein "Bad Thing" ™. Machen Sie eine * Kopie * davon, um darüber zu iterieren. –

+0

Oder verwenden Sie ein Listenverständnis: 'n = [nein für nein in n falls nein% 5> 0]' – Phylogenesis

Antwort

0

Explaintion

You are using pop() wrong.pop(x) nimmt ein Argument und öffnet oder entfernt diesen Index, nicht das Element. Wenn Sie also pop(5) nicht eine 5 aus der Liste knallen, knallen Sie den Index 5. Aus diesem Grund erhalten Sie einen Index außerhalb des Bereichsfehlers. Versuchen Sie, diese (beachten Sie, dass diese immer noch falsch ist, aber es ist im Interesse der Lehre, was Pop tut):

enumerate() nimmt im Grunde eine Liste oder Wörterbuch oder Tupel und gibt den Index und das Element in diesem Index. Beispiel:

x = [1,2,3,4,9] 
for index, item in enumerate(x): 
    print("index {}, item {}".format(index,item)) 

druckt:

index 0, item 1 
index 1, item 2 
index 2, item 3 
index 3, item 4 
index 4, item 9 

enumerate() wir, den Index erhalten und immer noch den Wert testen und die Dinge ändern sich mit ihm wie pop() es -Ing. Jetzt ist es eine schlechte Idee, eine Liste zu ändern, während wir sie durchgehen. Warum?

Das Problem, einen Container zu modifizieren (in diesem Fall pop() in list), während Sie durch es durchlaufen (Durchschleifen) ist, dass Sie Werte löschen können. Hier ein Beispiel:

alist = [5, 6, 7] 
for index, value in enumerate(alist): 
    del alist[index] 
print(alist) 
# Out: [6] 

Warum nur, dass es enthält [6] nach der Schleife und nicht eine leere Liste? Nun die erste Iteration entfernt das erste Element, das die 5 in Index 0 ist. Das ist schön, aber jetzt ist die Liste [6,7], 6 in den Index-Steckplatz 0. Wenn die nächste Schleife passiert, 7 ist im Index-Steckplatz 1, seit reduzieren die Größe der Liste jedes Mal um eins. Und so übersprungen wir den Wert 6 in Slot 0. Nach der zweiten Schleife beenden wir die for-Schleife, da nichts mehr zu loopen übrig ist.

Lösung

n = [1,2,3,4,9,10,10,10] 
new_list = [] 
for no in n: 
if (no%5!=0): 
    new_list.append(no) 

print n # gives [1, 2, 3, 4, 9] 

eine neue Liste erstellen, und fügen Sie Werte zu dieser Liste auf Ihrer Bedingung basiert, da Sie Elemente entfernen wollte, die x % 5 == 0 sind wir können Elemente hinzufügen, wenn es nicht gleich Null ist.

Wenn Sie etwas mehr „Pythonic“ oder Phantasie wollen oder Motto könnte man einfach tun:

x = [1,2,3,4,9,10,10,10] 
new_list = [a for a in x if a % 5 != 0] 
print(new_list) 

Es heißt ein list comprehension. Sehr nützlich in Python.

0

Wie Graham sagte, Sie verwenden Liste falsch. Unter dem Code können Sie eine bessere Idee haben.

x=int(input("limit")) 
n=[] 
for i in range (x): 
k=input("number to add") 
n.append(k) 
print "to pop the multiples of five" 
print n 
for no in n: 
if (no%5==0): 
    n.pop(n.index(no)) # remove index of element you want to remove 
print n 
Verwandte Themen