Supprimer un sous-ensemble d'un dict de la liste
-
03-07-2019 - |
Question
C’est vraiment facile à expliquer avec un exemple, donc pour supprimer l’intersection d’une liste dans un dict, je fais habituellement quelque chose comme ceci:
a = {1:'', 2:'', 3:'', 4:''}
exclusion = [3, 4, 5]
# have to build up a new list or the iteration breaks
toRemove = []
for var in a.iterkeys():
if var in exclusion:
toRemove.append(var)
for var in toRemove:
del a[var]
Cela peut sembler un exemple inhabituel, mais il est surprenant de constater le nombre de fois où j'ai dû faire quelque chose comme ça. Faire cela avec des sets serait beaucoup plus agréable, mais je veux clairement conserver les "valeurs" du dict.
Cette méthode est ennuyeuse car elle nécessite deux boucles et un tableau supplémentaire. Existe-t-il un moyen plus propre et plus efficace de le faire?
La solution
Envisagez de dict.pop :
for key in exclusion:
a.pop(key, None)
Le Aucun
empêche Pop de lever une exception lorsque clé
n'est pas une clé.
Autres conseils
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion)
Pourquoi ne pas simplement utiliser la méthode keys
au lieu de iterkeys
? De cette façon, vous pouvez le faire en une boucle, car il retourne une liste, pas un itérateur.
Vous pouvez modifier votre liste d'exclusion en un ensemble, puis utilisez simplement l'intersection pour obtenir le chevauchement.
exclusion = set([3, 4, 5])
for key in exclusion.intersection(a):
del a[key]