def merge_dicts(*dicts,
                filler = 0):
    """
    =================================================================================================
    merge_dicts(*dicts, filler)
    
    This function takes an arbitrary number of dictionaries and merges them together. If a key is not
    found in one of the dictionaries, the filler value is introduced.
    
    =================================================================================================
    Arguments:
    
    dicts   ->  An arbitrary number of dictionaries
    filler  ->  The value used as filler when one dictionary does not have the same key as another.
    
    =================================================================================================
    Returns: A dictionary of lists, where the keys are the keys from all dictionaries used as inputs
             and the values are lists of values, with filler values where values were not identified.
    
    =================================================================================================
    """
    # Use dictionary comprehension to initialize the new_dict
    new_dict = {key : [value] for key, value in dicts[0].items()}
    # Loop over the number of dictionaries, minus the zeroeth dictionary.
    for i in range(1,len(dicts)):
        # Loop over the keys and values in the ith dictionary
        for key, value in dicts[i].items():
            # If the current key is not already a key in the dictionary
            if str(key) not in new_dict:
                # Then make that a key, with value as a list containing i
                # filler values and the current dict value
                new_dict[key] = [filler for _ in range(i)] + [value]
            # If the key is already in the dict and there are the same
            # number of values as the index
            elif str(key) in new_dict and len(new_dict[key]) == i:
                # Then simply add the value to the dictionary, as
                # there are enough values in the current list
                new_dict[key].append(value)
            # Otherwise, we need to include a filler value along
            # with the value
            else:
                # so upate the lsit with a filer and the value
                new_dict[key] = [*new_dict[key], filler, value]
        # Once each dictionary is completeed,
        for key, value in new_dict.items():
            # loop over the newdict and see which items were not
            # updated
            if len(value) < i+1:
                # and add filler to the newdict, to ensure they stay
                # the same size as each list.
                new_dict[key] = new_dict[key] + [filler]
    # Once the merger is complete, return the newdict
    return new_dict