Path: csiph.com!eternal-september.org!reader02.eternal-september.org!aioe.org!yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: Supprimer efficacement "sur place" des valeurs d'un dictionnaire, dans une fonction Date: Fri, 18 Jun 2021 01:22:43 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Lines: 49 Message-ID: <87wnqs84ak.fsf@universite-de-strasbourg.fr.invalid> References: NNTP-Posting-Host: yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Complaints-To: abuse@aioe.org User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:aiSTzP2ir0rT68Y7hGmpsZjTMfw= Xref: csiph.com fr.comp.lang.python:3583 Olivier Miakinen writes: > Je suppose que j'ai un dictionnaire dict1, et un autre dictionnaire dict2 > qui est garanti =C3=AAtre un sous-dictionnaire de dict1, dans le sens que= toutes > les cl=C3=A9s de dict2 sont aussi des cl=C3=A9s de dict1 (il se trouve qu= e les valeurs > correspondent aussi, mais =C3=A0 la limite peu importe). > > Je voudrais =C3=A9crire une fonction qui prenne en param=C3=A8tre dict1 e= t dict2, qui > supprime de dict1 toutes les valeurs pr=C3=A9sentes dans dict2, et qui re= tourne > True ou False selon que tout a =C3=A9t=C3=A9 supprim=C3=A9 ou non. > > > Par exemple je pourrais =C3=A9crire : > > def moins(dict1, dict2): > for k in dict2: > del dict1[k] > return dict1 =3D=3D {} > > > Si ma fonction n'avait pas =C3=A0 supprimer les valeurs "sur place" je po= urrais > =C3=A9crire plus simplement : > > def moins(dict1, dict2): > dict1 =3D { k:v for k,v in dict1.items() if not k in dict2 } > return dict1 =3D=3D {} > > ... mais =C3=A7a ne modifierait pas le dict1 pass=C3=A9 en param=C3=A8tre. > > Existe-t-il une m=C3=A9thode plus efficace ? Pas que je sache (en g=C3=A9n=C3=A9ral les dictionnaires ne sont pas optimi= s=C3=A9s en priorit=C3=A9 pour la suppression). J'imagine que ton dictionnaire est r=C3=A9f=C3=A9renc=C3=A9 par ailleurs, donc ta premi=C3=A8re fonction est s= =C3=BBrement la bonne. Pour le bool=C3=A9en en retour, tu peux aussi utiliser : - return len(dict1) =3D=3D 0 - return bool(dict1) Je n'aime pas les conversions, mais ici le test sera fait de la "meilleure" fa=C3=A7on possible (j'imagine). -- Alain.