5 Best Ways to Remove Empty Strings from a List in Python

πŸ’‘ Problem Formulation: When working with data in Python, it’s common to encounter lists of strings that may contain empty elements. For example, after processing text or CSV files, one might have a list like ["apple", "", "banana", ""]. The goal is to remove the empty strings to get a cleaner list: ["apple", "banana"]. This article explains five methods to achieve this, catering to different scenarios and preferences.

Method 1: Using a List Comprehension

One of the most Pythonic ways to remove empty strings from a list is using list comprehension, which provides a concise syntax for creating new lists by filtering out unwanted elements. This approach is generally more efficient and easier to read compared to traditional for-loops.

Here’s an example:

fruits = ["apple", "", "banana", "", "cherry"]
filtered_fruits = [fruit for fruit in fruits if fruit]
print(filtered_fruits)

Output: ['apple', 'banana', 'cherry']

This code creates a new list filtered_fruits populated only with non-empty strings from the original fruits list. The condition if fruit ensures that only truthy (non-empty) strings are included.

Method 2: Using the filter Function

The filter() function in Python can be used to create an iterator from a collection, such as a list, filtering out elements based on a provided function. For simplicity, None can be used as the function when we want to remove falsy values, like empty strings.

Here’s an example:

fruits = ["apple", "", "banana", "", "cherry"]
filtered_fruits = list(filter(None, fruits))
print(filtered_fruits)

Output: ['apple', 'banana', 'cherry']

The filter(None, fruits) construct removes all elements that are False in a Boolean context (such as empty strings), then we convert the resulting iterator back to a list to get filtered_fruits.

Method 3: Filtering with a Function

If you need more control over the filtering criteria or want to use custom logic, you can define a function to pass to filter(). This adds flexibility for more complex conditions.

Here’s an example:

def is_not_empty(s):
    return s != ""

fruits = ["apple", "", "banana", "", "cherry"]
filtered_fruits = list(filter(is_not_empty, fruits))
print(filtered_fruits)

Output: ['apple', 'banana', 'cherry']

The custom is_not_empty() function is used to specify which strings should be included, providing better readability and the ability to accommodate more intricate filters if needed.

Method 4: Using a Lambda Function

Lambda functions in Python provide a lightweight syntax for writing anonymous functions. This is especially handy for small, on-the-fly functions that you don’t want to define in a separate statement.

Here’s an example:

fruits = ["apple", "", "banana", "", "cherry"]
filtered_fruits = list(filter(lambda s: s != "", fruits))
print(filtered_fruits)

Output: ['apple', 'banana', 'cherry']

A lambda function is used directly within the filter() call. This approach is very concise and eliminates the need to define a separate function as long as the filter logic remains simple.

Bonus One-Liner Method 5: Using remove() in a While Loop

If you prefer to modify the list in-place rather than creating a new one, you can use a while loop combined with the remove() method. However, this method might be less efficient for large lists.

Here’s an example:

fruits = ["apple", "", "banana", "", "cherry"]
while "" in fruits:
    fruits.remove("")
print(fruits)

Output: ['apple', 'banana', 'cherry']

The while loop runs as long as there is an empty string in fruits. Each iteration removes the first occurrence of an empty string until there are no more left.

Summary/Discussion

  • Method 1: List Comprehension. Strengths: Concise and Pythonic; generally very readable. Weaknesses: Creates a new list instead of modifying in-place.
  • Method 2: Using the filter Function. Strengths: Functional programming style, concise. Weaknesses: Less intuitive for beginners; creates a new list.
  • Method 3: Filtering with a Function. Strengths: Customizable, clearer intent with named function. Weaknesses: Verbose for simple cases; creates a new list.
  • Method 4: Using a Lambda Function. Strengths: Inline, no need for function definition. Weaknesses: Can be less readable for complicated conditions; creates a new list.
  • Method 5: Using remove() in a While Loop. Strengths: Modifies the list in-place. Weaknesses: Potentially less efficient, especially for long lists.