python: dict elem torlese iteracio kozben

van erre szep megoldas?

d={"a":100,"az":73,"hup":10,"abc":1,"xyz":3,"asdf":1}

for k in d:
    if d[k]==1: del d[k]

RuntimeError: dictionary changed size during iteration

megkerulni persze meg lehet, pl. elore lemasolni a d.keys() tombot es abban iteralni, vagy egy kulon tombbe gyujteni a torlendoket es egy masodik ciklusban csinalni a del-t...

Hozzászólások

Szerkesztve: 2025. 06. 09., h – 09:21
d={"a":100,"az":73,"hup":10,"abc":1,"xyz":3,"asdf":1}

d2 = dict(filter(lambda item: item[1] != 1, d.items()))

print(d2)

Szerintem ennél különösebben szebb megoldás nincs.

Psszt, elárulom az IP-címemet: 192.168.0.14

Hát, írhatsz magadnak egy saját típust, ha erre van igényed :) Az kevésbé ér, hogy kézzel meg tudnám írni c-ben, mert nincs is ilyen benne, ezért kapja be a python, hogy nem azt tudja a dict megoldásuk, ami neked kell.

Cserébe nem nagyon fogod megúszni szerintem, ki kell gyűjteni a kulcsokat :(

Megjegyzed a pozíciót , break aztán kint delete. 

zászló, zászló, szív

Nem biztos, hogy a memóriát akarja visszakapni :)

Egyébként bár nem túrtam soha a mélyére, de azért elég sok belső cache meg state store használja a dictet, ha elakarítod az elemre a referenciákat, akkor nem szokott elfogyni alóla mem. (Persze lehet, hogy nagyon kicsit leakel, mert csak az ojjektum takarodik el, a dict által használt bucketek vagy környékükön vmi meg nem). És ha meg elbaszod, akkor meg de :)

Szerkesztve: 2025. 06. 09., h – 10:47

Ez vsz programnyelv-fuggetlenul is egy kevesse elegans(an kinezo) dolog lesz. Legalabbis C-ben mig egy sima mezei iterator kb ilyen lehet:

for ( d = d_first; d != NULL; d = d->next )
 {      do_something(d);
 }

Addig a torles:

for ( d = d_first; d != NULL; )
 {      item_d_t *d_next; 
        d_next = d->next;
        if ( d->k == 1 ) delete_item(d);
        d = d_next;
 }

Szoval... jo kerdes... 

Ez egy dontes kerdese, amikor tervezik a nyelvet.

Az iterator ugye olyan gyors kene, hogy legyen, amennyire lehet. Ergo, nem fer bele, hogy meg csekkelgessek, hogy "valtozott-e", es lekezeljek.

Kiveve a kifejezetten nem teljesitmenyre, hanem inkabb korrekt viselkedesre optimalizalt nyelveket/platformokat. Az R pont ilyen. Azert van ez.

Igy mondjuk? (a .keys() csak olvashatosag miatt, anelkul is jo)

>>> d={"a":100,"az":73,"hup":10,"abc":1,"xyz":3,"asdf":1}
>>> for k in list(d.keys()):
...     if d[k]==1: del d[k]
... 
>>> d
{'a': 100, 'az': 73, 'hup': 10, 'xyz': 3}

Ja, es mehetne list helyett tuple, kicsit eroforraskimelobb.

A strange game. The only winning move is not to play. How about a nice game of chess?

d={"a":100,"az":73,"hup":10,"abc":1,"xyz":3,"asdf":1}
for k, v in list(d.items()):
    if v == 1:
        d.pop(k)
print(d)

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”