Sprawdziłem wszystkie pozostałe pytania z tym samym błędem, ale nie znalazłem pomocnego rozwiązania = /
Mam słownik list:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
w którym niektóre wartości są puste. Pod koniec tworzenia tych list chcę usunąć te puste listy przed zwróceniem mojego słownika. Obecnie próbuję to zrobić w następujący sposób:
for i in d:
if not d[i]:
d.pop(i)
daje mi to jednak błąd wykonania. Zdaję sobie sprawę, że nie można dodawać / usuwać elementów w słowniku podczas iteracji ... co w takim razie można by rozwiązać?
python
list
dictionary
loops
użytkownik1530318
źródło
źródło
keys
tworzy kopię kluczy , którą możesz iterować”, czyliplural
klucze, prawda? W przeciwnym razie, jak iterować po jednym kluczu?for i in d.keys()
faktycznie działa ogólnie w Pythonie 3.x , ale ponieważ iteruje się nad iterowalnym widokiem kluczy słownika, wywoływanied.pop()
podczas pętli prowadzi do tego samego błędu, jaki znaleziono.for i in list(d)
emuluje nieco nieefektywne zachowanie Pythona 2 podczas kopiowania kluczy do listy przed iteracją, w szczególnych okolicznościach, takich jak twoje.list(d.keys())
tworzy to samo wyjście, colist(d)
wywołanielist
adict
zwraca klucze.keys
Wezwanie (choć nie tak drogie) jest niepotrzebna.Wystarczy użyć słownika, aby skopiować odpowiednie elementy do nowego nagrania
Do tego w Pythonie 3
źródło
d.iteritems()
dał mi błąd. Użyłemd.items()
zamiast tego - używając python3Musisz tylko użyć „kopiuj”:
W ten sposób iterujesz po oryginalnych polach słownika, a w locie możesz zmienić żądany dykt (d dykt). Działa na każdej wersji Pythona, więc jest bardziej przejrzysty.
źródło
Starałbym się przede wszystkim unikać wstawiania pustych list, ale ogólnie używałbym:
Jeżeli przed 2.7:
Lub tylko:
źródło
W przypadku Python 3:
źródło
Nie można iterować słownika, który zmienia się podczas pętli for. Wykonaj rzutowanie na listę i iteruj po tej liście, to działa dla mnie.
źródło
W takich sytuacjach lubię robić głęboką kopię i przeglądać ją, modyfikując oryginalny dyktand.
Jeśli pole wyszukiwania znajduje się na liście, możesz wyliczyć w pętli for listy, a następnie określić pozycję jako indeks, aby uzyskać dostęp do pola w oryginalnym nagraniu.
źródło
To działało dla mnie:
Przesłanie pozycji słownika na listę tworzy listę jej pozycji, dzięki czemu można iterować nad nią i unikać
RuntimeError
.źródło
dictc = {"stName": "asas"} keys = dictc.keys () dla klucza na liście (klucze): dictc [key.upper ()] = 'Nowa wartość' print (str (dictc))
źródło
Przyczyną błędu środowiska wykonawczego jest to, że nie można iterować przez strukturę danych, gdy jej struktura zmienia się podczas iteracji.
Jednym ze sposobów na osiągnięcie tego, czego szukasz, jest użycie listy, aby dołączyć klucze, które chcesz usunąć, a następnie użycie funkcji pop w słowniku, aby usunąć zidentyfikowany klucz podczas iteracji po liście.
źródło
Python 3 nie pozwala na usuwanie podczas iteracji (przy użyciu pętli powyżej) słownika. Istnieją różne alternatywy; Jednym prostym sposobem jest zmiana następującej linii
Z
źródło