Как рассчитать оптимальную ширину столбца?

У меня есть небольшой набор значений данных столбца, которые я хочу отобразить на дисплее переменной ширины. Один столбец имеет небольшой диапазон допустимых размеров (скажем, 8-10 символов), один отображает UUID (всегда 36 символов), а остальные представляют собой идентификаторы переменной длины.

Я хочу максимизировать объем данных, которые я могу отобразить, учитывая, что терминал может иметь ширину не более 72 символов и около 400 символов.

Значения, которые превышают назначенную им ширину столбца, будут сокращены.

Как мне это рассчитать?

Я использую python, если это кому-то важно.


person Chris R    schedule 05.12.2010    source источник
comment
Я думаю, вам нужно более конкретно указать, в чем заключается ваша проблема. Почему бы просто не выделить столбцы в некотором порядке, пока вы не заполните доступную ширину?   -  person Gareth Rees    schedule 05.12.2010


Ответы (1)


def getMaxLen(xs):
    ys = map(lambda row: map(len, row), xs)
    return reduce(
        lambda row, mx: map(max, zip(row,mx)),
        ys)

def formatElem((e, m)):
    return e[0:m] + " "*(m - len(e))

# reduceW is some heuristic that will try to reduce
# width of some columns to fit table on a screen.
# This one is pretty inefficient and fails on too many narrow columns.
def reduceW(ls, width):
    if len(ls) < width/3:
        totalLen = sum(ls) + len(ls) - 1
        excess = totalLen - width
        while excess > 0:
            m = max(ls)
            n = max(2*m/3, m - excess)
            ls[ls.index(m)] = n
            excess = excess - m + n
    return ls


def align(xs, width):
    mx = reduceW(getMaxLen(xs), width)
    for row in xs:
        print " ".join(map(formatElem, zip(row, mx)))

Пример:

data = [["some", "data", "here"], ["try", "to", "fit"], ["it", "on", "a screen"]]
align(data, 15)
>>> some data here 
>>> try  to   fit  
>>> it   on   a scr
person max taldykin    schedule 05.12.2010