web-dev-qa-db-fra.com

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 correspondant au contenu. 

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

En fait, j'aimerais 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] == '[email protected]':
         emails.pop(index)
         otherarray.pop(index)
96
locoboy

Vous n'avez pas besoin de parcourir le tableau. Juste:

>>> x = ['[email protected]', '[email protected]']
>>> x
['[email protected]', '[email protected]']
>>> x.remove('[email protected]')
>>> x
['[email protected]']

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

EDIT: Après votre édition, vous n'avez toujours pas besoin de réitérer. Il suffit de faire:

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

Utiliser filter() et lambda fournirait une méthode nette et concise pour supprimer les valeurs indésirables:

newEmails = list(filter(lambda x : x != '[email protected]', emails))

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

10
Ron Kalian

Pour ce faire, il est judicieux 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 == '[email protected]')

new_emails, new_other_list = Zip(*filtered)

De même, si vous n'utilisez pas array.array() ou numpy.array(), il est fort probable que vous utilisiez [] ou list(), qui vous donnent des listes et non des tableaux. Pas la même chose.

3
pillmuncher

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

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

Dans votre cas, la solution Bogdan est satisfaisante, mais votre choix de structure de données n’est pas très bon. Avoir à gérer ces deux listes avec des données de l’une liées aux données de l’autre au même index est maladroit.

Une liste de tupple (email, otherdata) peut être meilleure, ou un dict avec email comme clé. 

2
MatthieuW

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

Nous commençons avec 2 listes d'égale longueur: emails, otherarray. L'objectif est de supprimer les éléments des deux listes pour chaque index iemails[i] == '[email protected]'.

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

emails = ['[email protected]', '[email protected]', '[email protected]']
otherarray = ['some', 'other', 'details']

from operator import itemgetter

res = [(i, j) for i, j in Zip(emails, otherarray) if i!= '[email protected]']
emails, otherarray = map(list, map(itemgetter(0, 1), Zip(*res)))

print(emails)      # ['[email protected]', '[email protected]']
print(otherarray)  # ['some', 'details']
0
jpp