Skip to content

Chunk List

Zero-dependency Python snippets for splitting lists into chunks using the standard library.

10 snippets available in this sub-category.


Simple

Split list into chunks

list chunk split size data-structures

Split list into chunks of specified size

def chunk_list(lst, chunk_size):
    """Split list into chunks of specified size."""
    if chunk_size <= 0:
        raise ValueError("Chunk size must be positive")

    return [lst[i : i + chunk_size] for i in range(0, len(lst), chunk_size)]


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = chunk_list(numbers, 3)
print(result)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Notes

  • Uses list comprehension
  • Handles incomplete chunks
  • Preserves order
  • Simple and efficient

Split list with generator

list chunk generator memory data-structures

Split list into chunks using generator

def chunk_list_generator(lst, chunk_size):
    """Split list into chunks using generator."""
    if chunk_size <= 0:
        raise ValueError("Chunk size must be positive")

    for i in range(0, len(lst), chunk_size):
        yield lst[i : i + chunk_size]


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = list(chunk_list_generator(numbers, 3))
print(result)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# Memory efficient iteration
for chunk in chunk_list_generator(numbers, 3):
    print(chunk)  # [1, 2, 3], [4, 5, 6], [7, 8, 9]

Notes

  • Memory efficient
  • Lazy evaluation
  • Suitable for large lists
  • Generator pattern

Complex

Split list with fill value

list chunk fill padding data-structures

Split list into chunks with fill value

def chunk_list_with_fill(lst, chunk_size, fill_value=None):
    """Split list into chunks with fill value for incomplete chunks."""
    if chunk_size <= 0:
        raise ValueError("Chunk size must be positive")

    chunks = []
    for i in range(0, len(lst), chunk_size):
        chunk = lst[i : i + chunk_size]
        # Pad incomplete chunk with fill value
        while len(chunk) < chunk_size:
            chunk.append(fill_value)
        chunks.append(chunk)

    return chunks


numbers = [1, 2, 3, 4, 5, 6, 7]
result = chunk_list_with_fill(numbers, 3, 0)
print(result)  # [[1, 2, 3], [4, 5, 6], [7, 0, 0]]

# With custom fill value
result2 = chunk_list_with_fill(numbers, 3, "X")
print(result2)  # [[1, 2, 3], [4, 5, 6], [7, 'X', 'X']]

Notes

  • Pads incomplete chunks
  • Configurable fill value
  • Uniform chunk sizes
  • Useful for matrix operations

Split list with overlap

list chunk overlap sliding data-structures

Split list into overlapping chunks

def chunk_list_overlap(lst, chunk_size, overlap=0):
    """Split list into overlapping chunks."""
    if chunk_size <= 0 or overlap < 0 or overlap >= chunk_size:
        raise ValueError("Invalid chunk size or overlap")

    chunks = []
    step = chunk_size - overlap

    for i in range(0, len(lst), step):
        chunk = lst[i : i + chunk_size]
        if len(chunk) >= chunk_size // 2:  # Only add chunks with sufficient size
            chunks.append(chunk)

    return chunks


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = chunk_list_overlap(numbers, 4, 2)
print(result)  # [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8, 9, 10]]

Notes

  • Configurable overlap
  • Sliding window approach
  • Useful for signal processing
  • Maintains context

Split list by condition

list chunk condition filter data-structures

Split list into chunks based on condition

def chunk_list_by_condition(lst, condition_func):
    """Split list into chunks based on condition."""
    if not lst:
        return []

    chunks = []
    current_chunk = []

    for item in lst:
        if condition_func(item):
            if current_chunk:  # End current chunk
                chunks.append(current_chunk)
                current_chunk = []
        else:
            current_chunk.append(item)

    # Add final chunk if not empty
    if current_chunk:
        chunks.append(current_chunk)

    return chunks


numbers = [1, 2, 0, 3, 4, 0, 5, 6, 7, 0, 8]
# Split by zero
result = chunk_list_by_condition(numbers, lambda x: x == 0)
print(result)  # [[1, 2], [3, 4], [5, 6, 7], [8]]

# Split by even numbers
result2 = chunk_list_by_condition(numbers, lambda x: x % 2 == 0)
print(result2)  # [[1], [3], [5, 7], []]

Notes

  • Condition-based splitting
  • Flexible criteria
  • Preserves non-matching elements
  • Useful for data cleaning

Split list with maximum chunks

list chunk maximum limit data-structures

Split list into maximum number of chunks

def chunk_list(lst, chunk_size):
    # Function is defined in one of the above code block
    pass


def chunk_list_max_chunks(lst, max_chunks):
    """Split list into maximum number of chunks."""
    if max_chunks <= 0:
        raise ValueError("Maximum chunks must be positive")

    if max_chunks >= len(lst):
        return [[item] for item in lst]

    chunk_size = (len(lst) + max_chunks - 1) // max_chunks  # Ceiling division
    return chunk_list(lst, chunk_size)


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = chunk_list_max_chunks(numbers, 3)
print(result)  # [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

result2 = chunk_list_max_chunks(numbers, 5)
print(result2)  # [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

Notes

  • Limits number of chunks
  • Calculates optimal chunk size
  • Balances chunk distribution
  • Useful for parallel processing

Split list with custom chunking function

list chunk custom function data-structures

Split list using custom chunking function

def chunk_list_custom(lst, chunk_func):
    """Split list using custom chunking function."""
    if not lst:
        return []

    chunks = []
    current_chunk = []

    for item in lst:
        current_chunk.append(item)

        if chunk_func(current_chunk, item):
            chunks.append(current_chunk)
            current_chunk = []

    # Add remaining items as final chunk
    if current_chunk:
        chunks.append(current_chunk)

    return chunks


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


# Chunk when sum exceeds 10
def sum_exceeds_10(chunk, item):
    return sum(chunk) > 10


result = chunk_list_custom(numbers, sum_exceeds_10)
print(result)  # [[1, 2, 3, 4], [5, 6], [7, 8], [9, 10]]


# Chunk when length reaches 3
def length_reaches_3(chunk, item):
    return len(chunk) >= 3


result2 = chunk_list_custom(numbers, length_reaches_3)
print(result2)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

Notes

  • Flexible chunking logic
  • Dynamic chunk creation
  • Complex criteria support
  • Advanced use cases

Split list with balanced chunks

list chunk balanced distribution data-structures

Split list into balanced chunks

def chunk_list_balanced(lst, num_chunks):
    """Split list into balanced chunks."""
    if num_chunks <= 0:
        raise ValueError("Number of chunks must be positive")

    if num_chunks >= len(lst):
        return [[item] for item in lst]

    # Calculate base chunk size and remainder
    base_size = len(lst) // num_chunks
    remainder = len(lst) % num_chunks

    chunks = []
    start = 0

    for i in range(num_chunks):
        # Distribute remainder across first chunks
        chunk_size = base_size + (1 if i < remainder else 0)
        end = start + chunk_size
        chunks.append(lst[start:end])
        start = end

    return chunks


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = chunk_list_balanced(numbers, 3)
print(result)  # [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

result2 = chunk_list_balanced(numbers, 4)
print(result2)  # [[1, 2, 3], [4, 5, 6], [7, 8], [9, 10]]

Notes

  • Evenly distributes items
  • Handles remainder distribution
  • Optimal for parallel processing
  • Minimizes chunk size variance

Split list with performance monitoring

list chunk performance timing monitoring data-structures

Split list into chunks with performance monitoring

import time


def chunk_list_balanced(lst, num_chunks):
    # Function is defined in one of the above code block
    pass


def chunk_list_generator(lst, chunk_size):
    # Function is defined in one of the above code block
    pass


def chunk_list(lst, chunk_size):
    # Function is defined in one of the above code block
    pass


def chunk_list_with_timing(lst, chunk_size, method="comprehension"):
    """Split list into chunks with performance monitoring."""
    start_time = time.time()

    if method == "comprehension":
        result = chunk_list(lst, chunk_size)
    elif method == "generator":
        result = list(chunk_list_generator(lst, chunk_size))
    elif method == "balanced":
        result = chunk_list_balanced(lst, chunk_size)
    else:
        raise ValueError("Method must be 'comprehension', 'generator', or 'balanced'")

    end_time = time.time()

    return {
        "result": result,
        "execution_time": end_time - start_time,
        "list_length": len(lst),
        "chunk_size": chunk_size,
        "num_chunks": len(result),
        "method": method,
    }


# Performance comparison
large_list = list(range(100000))

comp_stats = chunk_list_with_timing(large_list, 1000, "comprehension")
gen_stats = chunk_list_with_timing(large_list, 1000, "generator")
bal_stats = chunk_list_with_timing(large_list, 100, "balanced")

print(f"Comprehension method: {comp_stats['execution_time']:.6f}s")
print(f"Generator method: {gen_stats['execution_time']:.6f}s")
print(f"Balanced method: {bal_stats['execution_time']:.6f}s")

Notes

  • Performance measurement
  • Method comparison
  • Benchmarking tool
  • Optimization insights

Split list with error handling

list chunk safe error handling data-structures

Safely split list into chunks with error handling

def chunk_list_with_fill(lst, chunk_size, fill_value=None):
    # Function is defined in one of the above code block
    pass


def chunk_list(lst, chunk_size):
    # Function is defined in one of the above code block
    pass


def chunk_list_safe(lst, chunk_size, fill_value=None):
    """Safely split list into chunks with error handling."""
    try:
        if not isinstance(lst, list):
            raise TypeError("Input must be a list")

        if not isinstance(chunk_size, int):
            raise TypeError("Chunk size must be an integer")

        if chunk_size <= 0:
            raise ValueError("Chunk size must be positive")

        if fill_value is not None:
            return chunk_list_with_fill(lst, chunk_size, fill_value)
        else:
            return chunk_list(lst, chunk_size)

    except Exception as e:
        print(f"Error chunking list: {e}")
        return [lst]  # Return original list as single chunk on error


# Safe chunking with error handling
try:
    result = chunk_list_safe([1, 2, 3, 4, 5, 6, 7, 8, 9], 3)
    print(result)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
except Exception as e:
    print(f"Error: {e}")

Notes

  • Comprehensive error handling
  • Type validation
  • Graceful degradation
  • Production ready

🔗 Cross-References

🏷️ Tags

list, chunk, split, generator, balanced, performance, data-structures

📝 Notes

  • List comprehension is most efficient for small to medium lists
  • Generators provide memory efficiency for large lists
  • Balanced chunking is optimal for parallel processing
  • Overlapping chunks are useful for sliding window operations
  • Custom chunking functions enable complex splitting logic
  • Consider performance implications for very large lists