3
votes

Supprimer des éléments d'une liste en fonction du contenu d'une autre

J'essaie de supprimer toutes les entités d'une liste d'une autre.

L'une des listes est une liste de listes.

Tandis qu'une autre est un liste des tuples .

ScoutNamed=[('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]

Résultat attendu

ScoutNamedFromPatrol=[('Ruariri', 'OBrien')]

Résultat réel

ScoutNameList = [[('Rory', 'Adair')], [('Fiona', 'Adair')]]
ScoutNamedFromPatrol = [('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]
ScoutNamedFromPatrol.remove(ScoutNameList)


0 commentaires

5 Réponses :


1
votes

Vous pouvez utiliser les compréhensions de liste -

ScoutNamedFromPatrol = [s for s in ScoutNamedFromPatrol if [s] not in ScoutNameList]


1 commentaires

[] manqué dans la réponse - essayez-le maintenant



2
votes
>>> for l in ScoutNameList:
    ScoutNamedFromPatrol.remove(l[0])
>>> ScoutNamedFromPatrol
[('Ruariri', 'OBrien')]

0 commentaires

0
votes

essayez ceci

ScoutNameList = [[('Rory', 'Adair')], [('Fiona', 'Adair')]]
ScoutNamedFromPatrol = [('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]
for x in ScoutNameList:
    for y in x:
        if y in ScoutNamedFromPatrol:

            ScoutNamedFromPatrol.remove(y)

print(ScoutNamedFromPatrol)


0 commentaires

1
votes

Vous pouvez utiliser une compréhension de liste. Cependant, notez que vous devez aplatir ScoutNameList , vous pouvez le faire avec itertools.chain :

list(chain(*ScoutNameList))
#[('Rory', 'Adair'), ('Fiona', 'Adair')]

Où:

[i for i in ScoutNamedFromPatrol if i not in chain(*ScoutNameList)]
#[('Ruariri', 'OBrien')]


0 commentaires

1
votes

Si l'ordre n'est pas important, vous pouvez utiliser set .difference ou son sucre syntaxique - . Comme ScoutNameList est imbriqué, chaque sous-liste contenant un seul élément, vous pouvez utiliser operator.itemgetter avec map pour construire un itérable de scalaires.

from itertools import chain
res = list(set(ScoutNamedFromPatrol) - set(chain.from_iterable(ScoutNameList)))

A less alternative fonctionnelle suggérée par @TrebuchetMS:

res = list(set(ScoutNamedFromPatrol) - set(x[0] for x in ScoutNameList))

Une version plus adaptable peut gérer plusieurs éléments dans listes internes de ScoutNameList:

from operator import itemgetter

res = list(set(ScoutNamedFromPatrol) - set(map(itemgetter(0), ScoutNameList)))
# [('Ruariri', 'OBrien')]


0 commentaires