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')]