J'ai le code suivant à supprimer de la liste data toutes les sous-listes pour lesquelles nums est un sous-ensemble et je ne comprends pas pourquoi cela ne fonctionne pas:

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

for each in data:
    if set(nums).issubset(each):
        data.remove(each)

print(data)
>>[[1, 2, 4], [1, 3, 4], [2, 3, 4]]

Pourquoi [1,2,4] n'est-il pas supprimé lorsque nums en est un sous-ensemble, comme illustré ci-dessous?

set(nums).issubset([1,2,4])
>>True
-1
West 17 avril 2018 à 15:34

3 réponses

Meilleure réponse

Vous modifiez la liste à partir de laquelle vous itérez.

Ceci est une meilleure solution:

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

data = [each for each in data if not set(nums).issubset(each)]
print(data)

À des fins d'apprentissage, consultez ce code qui fonctionne également. La différence avec votre code est qu'ici nous ne modifions pas la liste data dans la boucle for.

data=[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
nums=[1,2]

new_data = []
for each in data:
    if not set(nums).issubset(each):
        new_data.append(each)

data = new_data
print(data)
9
raul.vila 17 avril 2018 à 22:10

Parce que l'itérateur ne sait pas que vous avez supprimé un élément. Lorsqu'il passe au deuxième élément, il trouve [1, 3, 4] ce qui signifie que vous avez ignoré [1, 2, 4].

1
Gianluca Micchi 17 avril 2018 à 12:42

Pour votre information, il y a aussi une fonction filterfalse dans le très utile module itertools.

from itertools import filterfalse

data = list(filterfalse(set(nums).issubset, data))
1
Jacques Gaudin 17 avril 2018 à 18:49