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?

Était-ce utile?

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top