def all_states(N, subspace='gef'):
    """
    List all states in the desired subspace for N pigments

    Assumes hard-core bosons (no double-excitations of the same state)

    Parameters
    ----------
    N : int
        Number of sites.
    subspace : container, default 'gef'
        Container of any or all of 'g', 'e' and 'f' indicating the desired
        subspaces on which the operator is defined.

    Returns
    -------
    states : list
        List of all states defined in the desired subspace, where each state is
        defined as a list of sites in the excited state
    """
    states = []
    if 'g' in subspace:
        states.append([])
    if 'e' in subspace:
        for i in range(N):
            states.append([i])
    if 'f' in subspace:
        for i in range(N):
            for j in range(i + 1, N):
                states.append([i, j])
    return states