Supprimer efficacement "sur place" des valeurs d'un dictionnaire, dans une fonction
2 réponses
Olivier Miakinen
Bonjour,
Je suppose que j'ai un dictionnaire dict1, et un autre dictionnaire dict2
qui est garanti être un sous-dictionnaire de dict1, dans le sens que toutes
les clés de dict2 sont aussi des clés de dict1 (il se trouve que les valeurs
correspondent aussi, mais Í la limite peu importe).
Je voudrais écrire une fonction qui prenne en paramètre dict1 et dict2, qui
supprime de dict1 toutes les valeurs présentes dans dict2, et qui retourne
True ou False selon que tout a été supprimé ou non.
Par exemple je pourrais écrire :
def moins(dict1, dict2):
for k in dict2:
del dict1[k]
return dict1 == {}
Si ma fonction n'avait pas Í supprimer les valeurs "sur place" je pourrais
écrire plus simplement :
def moins(dict1, dict2):
dict1 = { k:v for k,v in dict1.items() if not k in dict2 }
return dict1 == {}
... mais ça ne modifierait pas le dict1 passé en paramètre.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Alain Ketterlin
Olivier Miakinen <om+ writes:
Je suppose que j'ai un dictionnaire dict1, et un autre dictionnaire dict2 qui est garanti être un sous-dictionnaire de dict1, dans le sens que toutes les clés de dict2 sont aussi des clés de dict1 (il se trouve que les valeurs correspondent aussi, mais Í la limite peu importe). Je voudrais écrire une fonction qui prenne en paramètre dict1 et dict2, qui supprime de dict1 toutes les valeurs présentes dans dict2, et qui retourne True ou False selon que tout a été supprimé ou non. Par exemple je pourrais écrire : def moins(dict1, dict2): for k in dict2: del dict1[k] return dict1 == {} Si ma fonction n'avait pas Í supprimer les valeurs "sur place" je pourrais écrire plus simplement : def moins(dict1, dict2): dict1 = { k:v for k,v in dict1.items() if not k in dict2 } return dict1 == {} ... mais ça ne modifierait pas le dict1 passé en paramètre. Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en priorité pour la suppression). J'imagine que ton dictionnaire est référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne. Pour le booléen en retour, tu peux aussi utiliser : - return len(dict1) == 0 - return bool(dict1) Je n'aime pas les conversions, mais ici le test sera fait de la "meilleure" façon possible (j'imagine). -- Alain.
Olivier Miakinen <om+news@miakinen.net> writes:
Je suppose que j'ai un dictionnaire dict1, et un autre dictionnaire dict2
qui est garanti être un sous-dictionnaire de dict1, dans le sens que toutes
les clés de dict2 sont aussi des clés de dict1 (il se trouve que les valeurs
correspondent aussi, mais Í la limite peu importe).
Je voudrais écrire une fonction qui prenne en paramètre dict1 et dict2, qui
supprime de dict1 toutes les valeurs présentes dans dict2, et qui retourne
True ou False selon que tout a été supprimé ou non.
Par exemple je pourrais écrire :
def moins(dict1, dict2):
for k in dict2:
del dict1[k]
return dict1 == {}
Si ma fonction n'avait pas Í supprimer les valeurs "sur place" je pourrais
écrire plus simplement :
def moins(dict1, dict2):
dict1 = { k:v for k,v in dict1.items() if not k in dict2 }
return dict1 == {}
... mais ça ne modifierait pas le dict1 passé en paramètre.
Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en
priorité pour la suppression). J'imagine que ton dictionnaire est
référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne.
Pour le booléen en retour, tu peux aussi utiliser :
- return len(dict1) == 0
- return bool(dict1)
Je n'aime pas les conversions, mais ici le test sera fait de la
"meilleure" façon possible (j'imagine).
Je suppose que j'ai un dictionnaire dict1, et un autre dictionnaire dict2 qui est garanti être un sous-dictionnaire de dict1, dans le sens que toutes les clés de dict2 sont aussi des clés de dict1 (il se trouve que les valeurs correspondent aussi, mais Í la limite peu importe). Je voudrais écrire une fonction qui prenne en paramètre dict1 et dict2, qui supprime de dict1 toutes les valeurs présentes dans dict2, et qui retourne True ou False selon que tout a été supprimé ou non. Par exemple je pourrais écrire : def moins(dict1, dict2): for k in dict2: del dict1[k] return dict1 == {} Si ma fonction n'avait pas Í supprimer les valeurs "sur place" je pourrais écrire plus simplement : def moins(dict1, dict2): dict1 = { k:v for k,v in dict1.items() if not k in dict2 } return dict1 == {} ... mais ça ne modifierait pas le dict1 passé en paramètre. Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en priorité pour la suppression). J'imagine que ton dictionnaire est référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne. Pour le booléen en retour, tu peux aussi utiliser : - return len(dict1) == 0 - return bool(dict1) Je n'aime pas les conversions, mais ici le test sera fait de la "meilleure" façon possible (j'imagine). -- Alain.
Olivier Miakinen
Bonjour Alain, Le 18/06/2021 01:22, Alain Ketterlin m'a répondu :
Par exemple je pourrais écrire : def moins(dict1, dict2): for k in dict2: del dict1[k] return dict1 == {} [...] Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en priorité pour la suppression). J'imagine que ton dictionnaire est référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne.
Merci de ta réponse.
Pour le booléen en retour, tu peux aussi utiliser : - return len(dict1) == 0
Oui.
- return bool(dict1)
En l'occurrence, plutÍ´t : - return not dict1
Je n'aime pas les conversions, mais ici le test sera fait de la "meilleure" façon possible (j'imagine).
Ok. Et encore merci. -- Olivier Miakinen
Bonjour Alain,
Le 18/06/2021 01:22, Alain Ketterlin m'a répondu :
Par exemple je pourrais écrire :
def moins(dict1, dict2):
for k in dict2:
del dict1[k]
return dict1 == {}
[...]
Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en
priorité pour la suppression). J'imagine que ton dictionnaire est
référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne.
Merci de ta réponse.
Pour le booléen en retour, tu peux aussi utiliser :
- return len(dict1) == 0
Oui.
- return bool(dict1)
En l'occurrence, plutÍ´t :
- return not dict1
Je n'aime pas les conversions, mais ici le test sera fait de la
"meilleure" façon possible (j'imagine).
Bonjour Alain, Le 18/06/2021 01:22, Alain Ketterlin m'a répondu :
Par exemple je pourrais écrire : def moins(dict1, dict2): for k in dict2: del dict1[k] return dict1 == {} [...] Existe-t-il une méthode plus efficace ?
Pas que je sache (en général les dictionnaires ne sont pas optimisés en priorité pour la suppression). J'imagine que ton dictionnaire est référencé par ailleurs, donc ta première fonction est sÍ»rement la bonne.
Merci de ta réponse.
Pour le booléen en retour, tu peux aussi utiliser : - return len(dict1) == 0
Oui.
- return bool(dict1)
En l'occurrence, plutÍ´t : - return not dict1
Je n'aime pas les conversions, mais ici le test sera fait de la "meilleure" façon possible (j'imagine).