Witam, jestem początkujący i nie wiem dlaczego ten kod nie działa i jak go zmienić żeby zadziałał
asd = {
"a":"b",
"d":"c",
"e":"f",
"g":"h",
}
for x in asd:
if x == "f":
del asd[x]
print(asd)
Witam, jestem początkujący i nie wiem dlaczego ten kod nie działa i jak go zmienić żeby zadziałał
asd = {
"a":"b",
"d":"c",
"e":"f",
"g":"h",
}
for x in asd:
if x == "f":
del asd[x]
print(asd)
Nie zapominaj o wcięciach
asd = {
"a":"b",
"d":"c",
"e":"f",
"g":"h",
}
for x in list(asd):
if asd[x] == "f":
del asd[x]
print(asd)
for wartość in słownik
operuje po wartościach, a usuwanie jest po kluczach. Jak chcesz iterować po kluczach, to iteruj po słownik.keys()
.
A tak swoją drogą, jak stajesz przed sytuacją, w której odczuwasz potrzebę przeszukiwania słownika po wartościach, to używasz złej struktury danych do swoich potrzeb.
Althorion napisał(a):
for wartość in słownik
operuje po wartościach, a usuwanie jest po kluczach. Jak chcesz iterować po kluczach, to iteruj posłownik.keys()
.
YYyyy... nie. for wartość in slownik
itertuje własnie po kluczach.
Ja bym poważnie zastanowił się czy faktycznie chcesz mutować istniejący słownik, a nie zbudować nowy z wyłączeniem niektórych elementów. Zmienianie może mieć smutne skutki uboczne jak błędy przy obsłudze wielu wątków. Jeśli nie jest to duży słownik to bardzo możliwe że lepiej będzie zrobić:
new_asd = {key:value for key,value in asd.items() if some_condition(key,value)}
@ledi12: Błąd
line 9, in <module>
del asd[v]
KeyError: 'f'
asddsaxyz napisał(a):
@ledi12: Błąd
line 9, in <module> del asd[v] KeyError: 'f'
Używając del
musisz podać klucz, czyli to pewnie byłoby del asd[k]
.
Najlepiej byłoby gdybyś użyć dict comprehension do zwrócenia nowego słownika tak jak pokazał @Shalom w tym poście.
Bezpieczniej używać .pop()
podobnie jak bezpieczniej robić .get()
zamiast używać operatora []
bo nie dostaniemy w twarz KeyError jeśli danego klucza nie ma. Ale w ogóle modyfikowanie słownika w trakcie iterowania po nim to średni plan.
asddsaxyz napisał(a):
dobra to inaczej, jak usunąć jedną konkretną wartości żeby była nie powiedziana w prost tylko np przez x?
Ogarnijmy kilka rzeczy zanim zaczniemy Ci pomagać.
Po pierwsze, kiedy mówisz "usunąć ze słownika" musisz sprecyzować czy chodzi Ci o zwrócenie nowego słownika bez tych wartości, czy czy chcesz zmodyfikować słownik in-place. Lepszą i bardziej popularną praktyką w pythonie jest zwrócenie nowych kolekcji, zamiast modyfikować istniejących, chyba że w jakichś dziwnych przypadkach.
Po drugie, pamiętaj że w słowniku dany klucz może wystąpić raz, a wartości ta sama może być kilka razy, np {'a': 0, 'b': 0, 'c': 0}
, więc musisz powiedzieć czy jak chcesz usunąć 0
z tego słownika, to chcesz usunąć tylko jedno występienie czy wszystkie (od pythona 3.7 słowniki mają kolejnośc zachowaną, więc w nowym pythonie możesz usunąć np "pierwszy element").
Więc, @asddsaxyz co dokładnie chcesz zrobić?
asddsaxyz napisał(a):
zmodyfikować istniejący bo chciałbym też umieć to robić w tym wypadku chodziło mi o wszytskie 0 ale fajnie było by znać oba sposoby usuwania
No to najprostszy sposób żeby to zrobić, to usunąć klucz podczas iterowania:
# ten kod nie działał
Ale szczerze mówiąc to jest strzał w stopę. Powinieneś zrobić dict-comprehension, that jak Shalom pokazał w tym poście.
dictionary = {
"a":"b",
"d":"c",
"e":"f",
"g":"h",
}
dictionary = {key: value for key,value in asd.items() if value != 'f'}
TomRiddle napisał(a):
asddsaxyz napisał(a):
No to najprostszy sposób żeby to zrobić, to usunąć klucz podczas iterowania:
dictionary = { "a":"b", "d":"c", "e":"f", "g":"h", } for key, value in dictionary.items(): if value == "f": del dictionary[key]
to nie działa, nawet jak w del zmieniłem key na value
@asddsaxyz: Faktycznie.
Ale coś się tak uparł na to del
? Mówię Ci już trzeci raz że lepiej użyć dict-comprehension, tak jak Shalom pokazał i nawet dostałeś przykład. Czemu nie chcesz go użyć?
@TomRiddle: wiem nie mogę udać komentarza że tamtej rzeczywiście jest lepszy i zadziałał po poprawdze