7
votes

Comment supprimer des éléments d'une liste contenant des mots trouvés dans des éléments dans une autre liste

Je veux supprimer des éléments de la liste 'A' où la liste 'B' contient des éléments avec des mots trouvés dans la liste 'A' xxx pré>

Le résultat doit être: p>

print a
['four five six', 'seven eight nine']


0 commentaires

4 Réponses :


6
votes

Utilisez une liste Comp et n'importe quel à la place: xxx


1 commentaires

Le problème de l'affiche original découle de la modification de la liste tout en itérant. Ce n'est pas le seul moyen d'éviter cela, mais c'est un bon.



8
votes

Les listes ne doivent pas être modifiées lorsqu'elles sont itératées. Cela peut avoir des effets secondaires indésirables, tels que la boucle sautant sur des objets.

généralement dans Python, vous devriez éviter les boucles qui ajoutent et suppriment des éléments de la liste une à la fois. Habituellement, ces types de boucles peuvent être remplacés par des compréhensions de liste plus idiomatique. P>

for i in a[:]:
    for x in b:
        if x in i:
            a.remove(i)


0 commentaires

0
votes
for i in reversed(range(len(a))):
    for j in reversed(range(len(b))):
        if b[j] in a[i]:
            a.remove(a[i])

# output = ['seven eight nine']
You have to go through your list from the end, otherwise items gets reordered.

0 commentaires

3
votes

Lorsque vous iTerez sur une liste, vous ne devez jamais supprimer des éléments! Cela gâchera votre itération. Le seul moyen de modifier de manière proprement une liste tout en itération sur celle-ci dans Python, c'est itérer à l'arrière de la longueur de la liste et supprimer des éléments à votre guise.

Par exemple, cela fonctionne comme une boucle de suppression continue en place: P >

a = ['one two three', 'four six five', 'seven eight nine']
b = ['two', 'five six']

for i in range(len(a) - 1, -1, -1):
    for x in b:
        for word in x.split():
            if word in a[i]:
                del a[i]
print a # correctly prints ['seven eight nine']


0 commentaires