def METHOD_NAME(target, key):
    # work on list of lattices
    if type(target) == gpt.lattice:
        return METHOD_NAME([target], key)
    # all lattices need to have the same grid and checkerboard
    grid = target[0].grid
    cb = target[0].checkerboard()
    assert all([x.grid is grid for x in target[1:]]) and all(
        [cb.tag == x.checkerboard().tag for x in target[1:]]
    )
    # special case to select all
    if type(key) == slice and key == slice(None, None, None):
        key = tuple([slice(None, None, None) for i in range(grid.nd)])
    # split coordinate and tensor index descriptors
    pos, tidx = split_key_to_coordinates_and_indices(grid, key)
    # map out the positions and tensor indices
    pos = map_pos(grid, cb, pos)
    tidx, shape = map_tidx_and_shape(target, tidx)
    # return triple of positions, tidx, and shape
    return pos, tidx, shape