'Display a list of strings as a compact set of columns.
Each column is only as wide as necessary.
Columns are separated by two spaces (one was not legible enough).'

def columnize(self, list, displaywidth=80):

    if (not list):
        self.stdout.write('<empty>\n')
        return
    nonstrings = [i for i in range(len(list)) if (not isinstance(list[i], str))]
    if nonstrings:
        raise TypeError, ('list[i]    not    a    string    for    i    in    %s' % ',    '.join(map(str, nonstrings)))
    size = len(list)
    if (size == 1):
        self.stdout.write(('%s\n' % str(list[0])))
        return
    for nrows in range(1, len(list)):
        ncols = (((size + nrows) - 1) // nrows)
        colwidths = []
        totwidth = (-2)
        for col in range(ncols):
            colwidth = 0
            for row in range(nrows):
                i = (row + (nrows * col))
                if (i >= size):
                    break
                x = list[i]
                colwidth = max(colwidth, len(x))
            colwidths.append(colwidth)
            totwidth += (colwidth + 2)
            if (totwidth > displaywidth):
                break
        if (totwidth <= displaywidth):
            break
    else:
        nrows = len(list)
        ncols = 1
        colwidths = [0]
    for row in range(nrows):
        texts = []
        for col in range(ncols):
            i = (row + (nrows * col))
            if (i >= size):
                x = ''
            else:
                x = list[i]
            texts.append(x)
        while (texts and (not texts[(-1)])):
            del texts[(-1)]
        for col in range(len(texts)):
            texts[col] = texts[col].ljust(colwidths[col])
        self.stdout.write(('%s\n' % str('        '.join(texts))))
