So lösen Sie die Größe des Wörterbuchs während der Iteration in Python

8

Ich möchte alle großen Werte und ihre Schlüssel in einem Wörterbuch herausgeben und das kleinste beibehalten. Hier ist der Teil meines Programms

%Vor%

Was zu

führt %Vor%

Wie kann ich diesen Fehler vermeiden?

    
YXH 22.11.2012, 20:34
quelle

7 Antworten

6

Alternative Lösungen

Wenn Sie nach dem kleinsten Wert im Wörterbuch suchen, können Sie dies tun:

%Vor%

Wenn du min nicht verwenden kannst, kannst du sorted:

verwenden %Vor%

Warum bekomme ich diesen Fehler?

Nebenbei bemerkt, der Grund dafür, dass Sie Runtime Error haben, ist, dass Sie in der inneren Schleife den Iterator ändern, auf dem Ihre äußere Schleife basiert. Wenn Sie mit pop einen Eintrag erreichen, der von der äußeren Schleife noch erreicht werden soll und der äußere Iterator diesen erreicht, versucht er auf ein entferntes Element zuzugreifen, wodurch der Fehler verursacht wird.
Wenn Sie versuchen, Ihren Code auf Python 2.7 (statt 3.x) auszuführen, erhalten Sie tatsächlich ein Key Error .

Was kann ich tun, um den Fehler zu vermeiden?

Wenn Sie ein iterables in einer Schleife basierend auf seinem Iterator ändern möchten, sollten Sie ein tiefe Kopie davon.

    
Nadir Sampaoli 22.11.2012, 20:55
quelle
5

Sie können copy.deepcopy verwenden, um eine Kopie des Originaldiktats zu erstellen und eine Schleife über die Kopie zu erstellen während die ursprüngliche ändern.

%Vor%

Ihr Problem besteht darin, über etwas zu iterieren, das Sie ändern.

    
Arthur Julião 22.11.2012 21:02
quelle
4

Versuchen Sie in Python3

%Vor%

1 weitere Sache sollte vorsichtig sein, wenn ein Diktat wiederholt wird, um seinen Schlüssel zu aktualisieren:

Code1:

%Vor%

Code2:

%Vor%

Ergebnis von code1 / code2 ist:

%Vor%

Mein Weg zur Lösung dieses unerwarteten Ergebnisses:

%Vor%

Link: Ссылка

    
69444091 23.09.2015 06:38
quelle
2

Zeichnen Sie den Schlüssel während der Schleife auf, und führen Sie nach Beendigung der Schleife dictionary.pop (key) aus. So:

%Vor%     
Odif Yltsaeb 22.11.2012 20:37
quelle
1

Hier ist eine Möglichkeit, es zu lösen:

  1. Aus dem Wörterbuch erhalten Sie eine Liste der Schlüssel, sortiert nach Wert
  2. Da der erste Schlüssel in dieser Liste den kleinsten Wert hat, können Sie damit machen, was Sie wollen.

Hier ist ein Beispiel:

%Vor%

Die geheime Soße hier ist in der sortierten () Funktion: anstatt nach Schlüsseln zu sortieren, sortieren wir nach Werten.

    
Hai Vu 22.11.2012 20:57
quelle
0

Wenn Sie nur den Schlüssel mit dem kleinsten Wert behalten möchten, würde ich dies tun, indem Sie zuerst dieses Element finden und dann ein neues Wörterbuch erstellen, das nur dieses enthält. Wenn Ihr Wörterbuch d wäre, würde so etwas in einer Zeile vorkommen:

%Vor%

Dadurch werden nicht nur Probleme beim Aktualisieren des Wörterbuchs beim Iterieren vermieden, es ist wahrscheinlich schneller als das Entfernen aller anderen Elemente.

Wenn Sie die Änderungen aus irgendeinem Grund vor Ort vornehmen müssen, würde Folgendes funktionieren, da vor dem Ändern des Wörterbuchs eine Kopie aller Schlüssel erstellt wird:

%Vor%     
martineau 22.11.2012 21:09
quelle
0

Wenn ich jetzt Ihre Schleife lese, möchten Sie nur das kleinste Element behalten, aber ohne min . Also, tun Sie das Gegenteil von dem, was Ihr Code jetzt tut, prüfen Sie, ob value1 < minValueSoFar , wenn ja, keep1 als minKeySoFar. Dann am Ende der Schleife (wie Zayatzz vorgeschlagen hat), machen Sie dictionary.pop(minKeySoFar)

Nebenbei bemerkt, ist der key1!=key -Test irrelevant und rechenintensiv, wenn man eine relativ lange Liste annimmt.

%Vor%     
mackworth 22.11.2012 20:48
quelle

Tags und Links