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)
5 Réponses :
Vous pouvez utiliser les compréhensions de liste -
ScoutNamedFromPatrol = [s for s in ScoutNamedFromPatrol if [s] not in ScoutNameList]
[] manqué dans la réponse - essayez-le maintenant
>>> for l in ScoutNameList:
ScoutNamedFromPatrol.remove(l[0])
>>> ScoutNamedFromPatrol
[('Ruariri', 'OBrien')]
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)
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')]
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')]