6 votes

Suppression d'un sous-ensemble d'un dict à l'intérieur d'une liste

Pour supprimer l'intersection d'une liste à l'intérieur d'un dict, je procède généralement de la manière suivante :

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]

Cet exemple peut sembler inhabituel, mais il est surprenant de constater le nombre de fois où j'ai eu à faire quelque chose de ce genre. Faire cela avec des ensembles serait beaucoup plus agréable, mais je veux clairement conserver les "valeurs" pour le dict.

Cette méthode est gênante car elle nécessite deux boucles et un tableau supplémentaire. Existe-t-il une méthode plus propre et plus efficace ?

14voto

Blair Conrad Points 56195

Considérer dict.pop :

for key in exclusion:
     a.pop(key, None)

En None empêche pop de lever une exception lorsque key n'est pas une clé.

3voto

Dave Webb Points 90034
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion)

2voto

SpoonMeiser Points 6211

Pourquoi ne pas utiliser la fonction keys au lieu de la méthode iterkeys ? De cette façon, vous pouvez le faire en une seule boucle parce qu'il renvoie une liste, pas un itérateur.

1voto

Brian Points 48423

Vous pourriez transformer votre liste d'exclusion en un ensemble, puis utiliser l'intersection pour obtenir le chevauchement.

exclusion = set([3, 4, 5])

for key in exclusion.intersection(a):
    del a[key]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X