892 votes

Supprimer les chaînes vides d’une liste de chaînes

Je veux supprimer toutes les chaînes vides d’une liste de chaînes en python.

Mon idée ressemble à ceci :

Y a-t-il une manière plus Pythonique pour cela ?

1447voto

livibetter Points 3862

Je voudrais utiliser filter:

str_list = filter(None, str_list) # fastest
str_list = filter(bool, str_list) # fastest
str_list = filter(len, str_list)  # a bit of slower
str_list = filter(lambda item: item, str_list) # slower than list comprehension

Tests:

>>> timeit('filter(None, str_list)', 'str_list=["a"]*1000', number=100000)
2.4797441959381104
>>> timeit('filter(bool, str_list)', 'str_list=["a"]*1000', number=100000)
2.4788150787353516
>>> timeit('filter(len, str_list)', 'str_list=["a"]*1000', number=100000)
5.2126238346099854
>>> timeit('[x for x in str_list if x]', 'str_list=["a"]*1000', number=100000)
13.354584932327271
>>> timeit('filter(lambda item: item, str_list)', 'str_list=["a"]*1000', number=100000)
17.427681922912598

380voto

Ib33X Points 832

Interprétations de la liste

list = ["first", "", "second"]
[x for x in list if x]

Sortie: ["premier", "deuxième"]

Edit: Raccourcie, comme l'a suggéré

96voto

Ivo van der Wijk Points 7239

filtre a effectivement une option spéciale pour cela:

filter(None, sequence)

Il va filtrer tous les éléments qui permettent d'évaluer la valeur False. Pas besoin d'utiliser une réelle appelable ici comme bool, len et ainsi de suite.

Il est tout aussi rapide que la carte(bool, ...)

17voto

thiruvenkadam Points 362

Au lieu de si x, je voudrais utiliser si X != "dans le but de simplement éliminer les cordes à vide. Comme ceci:

str_list = [x for x in str_list if x != '']

Cela permettra de préserver Aucun type de données au sein de votre liste. Aussi, dans le cas où votre liste d'entiers a et 0 est l'un d'entre eux, il sera également préservé.

Par exemple,

str_list = [None, '', 0, "Hi", '', "Hello"]
[x for x in str_list if x != '']
[None, 0, "Hi", "Hello"]

6voto

Aamir Mushtaq Points 151

Utiliser filter:

newlist=filter(lambda x: len(x)>0, oldlist) 

Les inconvénients de l'utilisation de filtre comme l'a fait remarquer, c'est qu'il est plus lent que les autres; aussi, lambda sont généralement coûteux.

Ou vous pouvez aller pour la plus simple et la plus itératif de tous:

# I am assuming listtext is the original list containing (possibly) empty items
for item in listtext:
    if item:
        newlist.append(str(item))
# You can remove str() based on the content of your original list

c'est la plus intuitive, les méthodes et il le fait dans le temps convenable.

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