'Parse a series of column definition lines like below.  There may be several
such blocks in a single file (where continuation characters have already been
stripped).
#N ID    XCENTER   YCENTER   MAG         MERR          MSKY           NITER
#U ##    pixels    pixels    magnitudes  magnitudes    counts         ##
#F %-9d  %-10.3f   %-10.3f   %-12.3f     %-14.3f       %-15.7g        %-6d'

def parse_col_defs(self, grouped_lines_dict):

    line_ids = ('#N', '#U', '#F')
    coldef_dict = defaultdict(list)
    stripper = (lambda s: s[2:].strip('    \\'))
    for defblock in zip(*map(grouped_lines_dict.get, line_ids)):
        for (key, line) in zip(line_ids, map(stripper, defblock)):
            coldef_dict[key].append(line.split())
    if self.data.is_multiline:
        (last_names, last_units, last_formats) = list(zip(*map(coldef_dict.get, line_ids)))[(-1)]
        N_multiline = len(self.data.first_block)
        for i in np.arange(1, (N_multiline + 1)).astype('U2'):
            extended_names = list(map(''.join, zip(last_names, itt.repeat(i))))
            if (i == '1'):
                coldef_dict['#N'][(-1)] = extended_names
            else:
                coldef_dict['#N'].append(extended_names)
                coldef_dict['#U'].append(last_units)
                coldef_dict['#F'].append(last_formats)
    get_col_width = (lambda s: int(self.re_format.search(s).groups()[0]))
    col_widths = [[get_col_width(f) for f in formats] for formats in coldef_dict['#F']]
    row_widths = np.fromiter(map(sum, col_widths), int)
    row_short = (Daophot.table_width - row_widths)
    for (w, r) in zip(col_widths, row_short):
        w[(-1)] += r
    self.col_widths = col_widths
    coldef_dict = dict(((k, sum(v, [])) for (k, v) in coldef_dict.items()))
    return coldef_dict
