Jak usunąć wartości ze słownika?

0

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)
0

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)
0

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.

2
Althorion napisał(a):

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().

YYyyy... nie. for wartość in slownik itertuje własnie po kluczach.

1

@Althorion:

lepiej tak:

for k,v in asd.items():
  magic
3

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)}
0

@ledi12: Błąd

line 9, in <module>
    del asd[v]
KeyError: 'f'
2
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.

1

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.

1
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ć?

0
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'}
0

@TomRiddle:

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

0

@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ć?

0

@TomRiddle: wiem nie mogę udać komentarza że tamtej rzeczywiście jest lepszy i zadziałał po poprawdze

1 użytkowników online, w tym zalogowanych: 0, gości: 1