def shift_tier(vector, base_name, left_orders, right_orders, oob="∅"):
    """
    Compute shifted versions of a vector.

    Parameters
    ----------
    vector : list
        Vector to be shifted.
    base_name : str
        Base name of the tier.
    left_orders: list of int
        List of left contexts to include in the shifts.
    right_orders: list of int
        List of right contexts to include in the shifts.
    oob : str
        Value to use for out-of-bounds tokens (default: "∅").
    """

    # Compute the requested left and right shifts, if any. Lengths
    # of zero are not allowed because, given Python's slicing, they
    # would return totally unexpected vectors. The [:len(x)] and
    # [-len(x):] slices are added so that we have exactly the
    # number of tokens in the shifted tier, even in cases where
    # the left or right orders are larger than the length of the
    # alignment (e.g., an alignment with 3 tokens and left order
    # of 5 would yield '0 0 0 0 0' and not '0 0 0').
    new_tiers = {}
    for left_order in left_orders:
        shifted_vector = [oob] * left_order + vector[:-left_order]
        shifted_name = f"{base_name}_L{left_order}"

        new_tiers[shifted_name] = shifted_vector

    for right_order in right_orders:
        shifted_vector = vector[right_order:] + [oob] * right_order
        shifted_name = f"{base_name}_R{right_order}"

        new_tiers[shifted_name] = shifted_vector

    return new_tiers