Python Flattening Methods
Overview of Flattening Techniques
graph TD
A[Flattening Methods] --> B[Recursive Approach]
A --> C[List Comprehension]
A --> D[Iterative Methods]
A --> E[Built-in Functions]
1. Recursive Flattening
Basic Recursive Implementation
def recursive_flatten(nested_list):
flattened = []
for item in nested_list:
if isinstance(item, list):
flattened.extend(recursive_flatten(item))
else:
flattened.append(item)
return flattened
## Example usage
nested = [1, [2, 3], [4, [5, 6]]]
print(recursive_flatten(nested))
## Output: [1, 2, 3, 4, 5, 6]
2. List Comprehension Method
Compact Flattening Technique
def list_comprehension_flatten(nested_list):
return [item for sublist in nested_list for item in (sublist if isinstance(sublist, list) else [sublist])]
## Example usage
nested = [1, [2, 3], [4, [5, 6]]]
print(list_comprehension_flatten(nested))
## Output: [1, 2, 3, 4, 5, 6]
3. Iterative Flattening
Using Iteration
def iterative_flatten(nested_list):
flattened = []
stack = [nested_list]
while stack:
current = stack.pop()
for item in reversed(current):
if isinstance(item, list):
stack.append(item)
else:
flattened.append(item)
return flattened
## Example usage
nested = [1, [2, 3], [4, [5, 6]]]
print(iterative_flatten(nested))
## Output: [1, 2, 3, 4, 5, 6]
4. Built-in Function Approach
import itertools
def itertools_flatten(nested_list):
return list(itertools.chain.from_iterable(
(itertools_flatten(x) if isinstance(x, list) else [x] for x in nested_list)
))
## Example usage
nested = [1, [2, 3], [4, [5, 6]]]
print(itertools_flatten(nested))
## Output: [1, 2, 3, 4, 5, 6]
Method |
Time Complexity |
Space Complexity |
Readability |
Recursive |
O(n) |
O(n) |
Medium |
List Comprehension |
O(n) |
O(n) |
High |
Iterative |
O(n) |
O(n) |
Medium |
Itertools |
O(n) |
O(n) |
Low |
Choosing the Right Method
At LabEx, we recommend:
- Recursive method for simple, shallow nested lists
- List comprehension for most general use cases
- Iterative approach for deep nested structures
- Itertools for functional programming scenarios
Handling Complex Nested Structures
def advanced_flatten(nested_list):
try:
return [item for sublist in nested_list
for item in (advanced_flatten(sublist) if isinstance(sublist, list) else [sublist])]
except TypeError:
return [nested_list]
## Example with mixed nested list
complex_nested = [1, [2, [3, 4]], [5, 6, [7, 8, [9]]]]
print(advanced_flatten(complex_nested))
## Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]