87 votes

Python : Comment supprimer les listes vides d'une liste ?

J'ai une liste contenant des listes vides :

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']

Comment puis-je supprimer les listes vides afin d'obtenir :

list2 = ['text', 'text2', 'moreText']

J'ai essayé list.remove('') mais cela ne fonctionne pas.

4 votes

'' != [] c'est pourquoi .remove n'a pas fonctionné. Mais c'est quand même une mauvaise solution (soit vous vérifiez s'il y a [] in list1 avant la main - O(n**2) - ou d'attraper l'erreur qu'il lance sinon - moche).

1 votes

C'est tellement étonnant quand tu as découvert que même si ta question n'est pas commune, quelqu'un l'a postée il y a longtemps et y a trouvé une belle réponse ! J'aime SO

151voto

Sven Marnach Points 133943

Essayez

list2 = [x for x in list1 if x != []]

Si vous voulez vous débarrasser de tout ce qui est "falsy", par exemple les chaînes vides, les tuples vides, les zéros, vous pouvez aussi utiliser

list2 = [x for x in list1 if x]

5 votes

+1 pour avoir mentionné l'autre façon qui me vient à l'esprit et en quoi elle diffère.

0 votes

Je sais que c'est vieux, mais je continue à voir cette méthode d'accolade et je ne trouve rien via Google à ce sujet (probablement parce que Google ne fait pas de ponctuation). Comment cela s'appelle-t-il pour que je puisse en savoir plus sur ce qui se passe réellement ici ?

5 votes

@David : Compréhensions de listes et Expressions du générateur . Il existe également des compréhensions de dictionnaires et des compréhensions d'ensembles.

86voto

lunaryorn Points 13621

Vous pouvez utiliser filter() au lieu d'une compréhension de liste :

list2 = filter(None, list1)

Si None est utilisé comme premier argument pour filter() il filtre toutes les valeurs de la liste donnée, c'est-à-dire False dans un contexte booléen. Cela inclut les listes vides.

Elle pourrait être légèrement plus rapide que la compréhension de liste, car elle n'exécute qu'une seule fonction en Python, le reste étant effectué en C.

1 votes

Pourquoi cette réponse n'a-t-elle pas plus de votes positifs et / ou n'est-elle pas la réponse acceptée ?

5 votes

@MattO'Brien car de nombreux programmeurs Python évitent filter() ainsi que lambda , map() et reduce() Cela comprend Guido lui-même bien que cet article soit un peu ancien. J'ai tendance à préférer les compréhensions de listes car la clarté est souvent plus importante que la légère augmentation de la vitesse avec ces méthodes et l'avantage de l'utilisation d'une liste. lambda opérateur. Ceci étant dit, ce cas est trivial car l'intention du programmeur est très claire.

18 votes

En Python3, je pense que cela doit être modifié en : list2 = list(filter(None, list1)). Juste au cas où les nouveaux utilisateurs de Python3 se demandent pourquoi cela ne fonctionne pas pour eux :)

9voto

Imran Points 20117

Appel à filter avec None filtrera toutes les valeurs erronées de la liste (qui est une liste vide).

list2 = filter(None, list1)

6voto

user225312 Points 22699
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']

1 votes

Quelqu'un peut-il éditer ce texte ? Je n'arrive pas à obtenir les options de formatage.

0 votes

(vous devez utiliser l'option {} )

0 votes

@RC : Merci ! Je le sais, mais pour une raison étrange, elle n'est pas visible (aucune option ne l'est).

3voto

Quelques options :

filter(lambda x: len(x) > 0, list1)  # Doesn't work with number types
filter(None, list1)  # Filters out int(0)
filter(lambda x: x==0 or x, list1) # Retains int(0)

session d'échantillonnage :

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> filter(lambda x: len(x) > 0, list1)
['text', 'text2', 'moreText']
>>> list2 = [[], [], [], [], [], 'text', 'text2', [], 'moreText', 0.5, 1, -1, 0]
>>> filter(lambda x: x==0 or x, list2)
['text', 'text2', 'moreText', 0.5, 1, -1, 0]
>>> filter(None, list2)
['text', 'text2', 'moreText', 0.5, 1, -1]
>>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X