148 votes

Comment supprimer un élément spécifique d'un tableau en utilisant python

Je veux écrire quelque chose qui supprime un élément spécifique d'un tableau. Je sais que je dois for parcourir le tableau pour trouver l'élément qui correspond au contenu.

Disons que j'ai un tableau d'e-mails et que je veux me débarrasser de l'élément qui correspond à une chaîne d'e-mail.

J'aimerais en fait utiliser la structure de boucle for car je dois également utiliser le même index pour d'autres tableaux.

Voici le code que j'ai :

 for index, item in emails:
    if emails[index] == 'something@something.com':
         emails.pop(index)
         otherarray.pop(index)

216voto

Bogdan Points 2829

Vous n'avez pas besoin d'itérer le tableau. Juste:

 >>> x = ['ala@ala.com', 'bala@bala.com']
>>> x
['ala@ala.com', 'bala@bala.com']
>>> x.remove('ala@ala.com')
>>> x
['bala@bala.com']

Cela supprimera la première occurrence qui correspond à la chaîne.

EDIT : après votre modification, vous n'avez toujours pas besoin d'itérer. Faites juste :

 index = initial_list.index(item1)
del initial_list[index]
del other_list[index]

19voto

Ron Kalian Points 806

L'utilisation de filter() et lambda fournirait une méthode claire et concise pour supprimer les valeurs indésirables :

 newEmails = list(filter(lambda x : x != 'something@something.com', emails))

Cela ne modifie pas les e-mails. Il crée la nouvelle liste newEmails contenant uniquement les éléments pour lesquels la fonction anonyme a renvoyé True.

5voto

MatthieuW Points 1070

Votre boucle for n'est pas correcte, si vous avez besoin de l'index dans la boucle for, utilisez :

 for index, item in enumerate(emails):
    # whatever (but you can't remove element while iterating)

Dans votre cas, la solution de Bogdan est correcte, mais votre choix de structure de données n'est pas si bon. Avoir à maintenir ces deux listes avec les données de l'une liées aux données de l'autre au même index est maladroit.

Une liste de tuples (e-mail, autres données) peut être meilleure, ou un dict avec e-mail comme clé.

4voto

pillmuncher Points 4726

La façon la plus sensée de le faire est d'utiliser zip() et une expression de compréhension de liste/générateur :

 filtered = (
    (email, other) 
        for email, other in zip(emails, other_list) 
            if email == 'something@something.com')

new_emails, new_other_list = zip(*filtered)

De plus, si vous n'utilisez pas array.array() ou numpy.array() , vous utilisez probablement [] ou list() , qui vous donnent des listes , pas des tableaux. Pas la même chose.

3voto

jpp Points 83462

Il existe une solution alternative à ce problème qui traite également des correspondances en double.

On commence avec 2 listes de longueur égale : emails , otherarray . L'objectif est de supprimer des éléments des deux listes pour chaque index iemails[i] == 'something@something.com' .

Ceci peut être réalisé en utilisant une compréhension de liste puis en fractionnant via zip :

 emails = ['abc@def.com', 'something@something.com', 'ghi@jkl.com']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in zip(emails, otherarray) if i!= 'something@something.com']
emails, otherarray = map(list, map(itemgetter(0, 1), zip(*res)))

print(emails)      # ['abc@def.com', 'ghi@jkl.com']
print(otherarray)  # ['some', 'details']

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