How to combine items from three lists of different sizes into one with balanced distribution in Python

2 Answers

0 votes
from itertools import zip_longest

def combine_balanced(*lists):
    """
    Combine multiple lists into one with balanced distribution.
    Shorter lists are padded with None and skipped in the final output.
    """
    combined = []
    for group in zip_longest(*lists, fillvalue=None):
        for item in group:
            if item is not None:  # Skip padding
                combined.append(item)
    return combined

list1 = [1, 2, 3]
list2 = ['A', 'B', 'C', 'D']
list3 = ['x', 'y']

# Combine with balanced distribution
result = combine_balanced(list1, list2, list3)

print("Balanced combined list:", result)



"""
run:

Balanced combined list: [1, 'A', 'x', 2, 'B', 'y', 3, 'C', 'D']

"""

 



answered Nov 11 by avibootz
0 votes
from itertools import cycle
from collections import deque

def balanced_merge(*lists):
    # Convert lists to deques for efficient popping
    deques = [deque(lst) for lst in lists if lst]
    total_items = sum(len(d) for d in deques)
    result = []

    # Calculate weights (proportions) for each list
    weights = [len(d) / total_items for d in deques]
    counters = [0] * len(deques)

    while any(deques):
        for i, d in enumerate(deques):
            if d and counters[i] <= min(counters):
                result.append(d.popleft())
                counters[i] += 1 / weights[i]  # prioritize smaller lists less often

    return result

list1 = [1, 2, 3]
list2 = ['A', 'B', 'C', 'D']
list3 = ['x', 'y']

# Combine with balanced distribution
result = balanced_merge(list1, list2, list3)

print("Balanced combined list:", result)



"""
run:

Balanced combined list: [1, 'A', 'x', 'B', 2, 'C', 'y', 3, 'D']

"""

 



answered Nov 11 by avibootz

Related questions

...