2010-12-05 34 views
0

J'ai un petit ensemble de valeurs de données de colonne que je veux afficher dans un affichage de largeur variable. Une colonne a une petite plage de tailles plausibles (par exemple, 8-10 caractères), une affiche un UUID (toujours 36 caractères), et les autres sont des identifiants de longueur variable.Comment puis-je calculer les largeurs de colonnes optimales?

Je veux maximiser la quantité de données que je peux afficher, étant donné que le terminal peut être devrait être aussi étroite que 72 caractères et aussi large que 400.

Les valeurs qui dépassent leur largeur de colonne affectée sera abrégé.

Comment devrais-je calculer cela? J'utilise Python, si c'est important pour n'importe qui.

+0

Je pense que vous devez être plus précis sur ce que votre problème est. Pourquoi ne pas simplement allouer des colonnes dans un certain ordre jusqu'à ce que vous ayez rempli la largeur disponible? –

Répondre

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))) 

Exemple:

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