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
3 réponses
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)
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]
.
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))
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.