Les réponses de hymloth et sven fonctionnent, mais elles ne modifient pas la liste (elles en créent une nouvelle). Si vous avez besoin de modifier l'objet, vous devez l'assigner à une tranche :
x[:] = [value for value in x if len(value)==2]
Cependant, pour les grandes listes dans lesquelles vous devez supprimer quelques éléments, cette méthode est gourmande en mémoire, mais elle s'exécute en O(n).
La réponse de glglgl souffre d'une complexité O(n²), car list.remove
est O(n).
Selon la structure de vos données, vous préférerez peut-être noter les index des éléments à supprimer et utiliser la fonction del
le travail clé à supprimer par index :
to_remove = [i for i, val in enumerate(x) if len(val)==2]
for index in reversed(to_remove): # start at the end to avoid recomputing offsets
del x[index]
Maintenant del x[i]
est également O(n) car il faut copier tous les éléments après l'indice i
(une liste est un vecteur), vous devrez donc la tester avec vos données. Néanmoins, cela devrait être plus rapide que d'utiliser remove
parce que vous ne payez pas pour le coût de l'étape de recherche de la suppression, et que le coût de l'étape de copie est le même dans les deux cas.
[edit] Très belle version in-place, O(n) avec des exigences de mémoire limitées, avec l'aimable autorisation de @Sven Marnach . Il utilise itertools.compress
qui a été introduit dans python 2.7 :
from itertools import compress
selectors = (len(s) == 2 for s in x)
for i, s in enumerate(compress(x, selectors)): # enumerate elements of length 2
x[i] = s # move found element to beginning of the list, without resizing
del x[i+1:] # trim the end of the list