2010-07-23 19 views
-1

J'ai le joli module d'impression, que j'ai préparé parce que je n'étais pas heureux que le module pprint ait produit des lignes de zillion pour la liste des nombres qui avaient une liste de liste. Voici un exemple d'utilisation de mon module.Comment étendre le joli module d'impression aux tables?

>>> a=range(10) 
    >>> a.insert(5,[range(i) for i in range(10)]) 
    >>> a 
    [0, 1, 2, 3, 4, [[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]], 5, 6, 7, 8, 9] 
    >>> import pretty 
    >>> pretty.ppr(a,indent=6) 

    [0, 1, 2, 3, 4, 
      [ 
      [], 
      [0], 
      [0, 1], 
      [0, 1, 2], 
      [0, 1, 2, 3], 
      [0, 1, 2, 3, 4], 
      [0, 1, 2, 3, 4, 5], 
      [0, 1, 2, 3, 4, 5, 6], 
      [0, 1, 2, 3, 4, 5, 6, 7], 
      [0, 1, 2, 3, 4, 5, 6, 7, 8]], 5, 6, 7, 8, 9] 
code

est comme ceci:

""" pretty.py prettyprint module version alpha 0.2 
    mypr: pretty string function 
    ppr: print of the pretty string 
    ONLY list and tuple prettying implemented! 
""" 
def mypr(w, i = 0, indent = 2, nl = '\n') : 
    """ w = datastructure, i = indent level, indent = step size for indention """ 
    startend = {list : '[]', tuple : '()'} 
    if type(w) in (list, tuple) : 
     start, end = startend[type(w)] 
     pr = [mypr(j, i + indent, indent, nl) for j in w] 
     return nl + ' ' * i + start + ', '.join(pr) + end 
    else : return repr(w) 

def ppr(w, i = 0, indent = 2, nl = '\n') : 
    """ see mypr, this is only print of mypr with same parameters """ 
    print mypr(w, i, indent, nl) 

Voici un texte fixe pour l'impression de table dans mon module assez d'impression:

## let's do it "manually" 
width = len(str(10+10)) 
widthformat = '%'+str(width)+'i' 
for i in range(10): 
    for j in range(10): 
     print widthformat % (i+j), 
    print 

Avez-vous une meilleure alternative pour ce code à généraliser assez pour le joli module d'impression?

Ce que je trouve pour ce genre de cas réguliers après avoir affiché la question est ce module: prettytable A simple Python library for easily displaying tabular data in a visually appealing ASCII table format

+1

Votre question est un peu « pourquoi est-il fait exactement ce que je dis à faire?". La réponse est que vos attentes sur ce qu'il devrait faire pour vous ne correspondent pas à ce qu'il fait. – msw

+0

J'ai des attentes que les générateurs devraient donner des résultats utiles pour l'interprète. Le langage des icônes donne bien 0..n réponses. Le langage des icônes ne répond pas à mes attentes d'utilisation interprétative, que Python remplit pour la plupart. Les attentes et la paresse sont source de développement :) –

+0

Les générateurs ne peuvent pas être imprimés car ils ne peuvent pas être rembobinés (par définition). Donc, vos attentes n'ont aucun sens, soyez heureux qu'ils ne soient pas remplis: p Ce que vous voulez dire par '0 .. n' est' xrange (0, n) 'en Python et ils ont une représentation très sensible. –

Répondre

7

Si vous cherchez belle mise en forme pour les matrices, la sortie de numpy ressemble beaucoup à droite de la boîte:

from numpy import * 
print array([[i + j for i in range(10)] for j in range(10)]) 

sortie:

[[ 0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13] 
[ 5 6 7 8 9 10 11 12 13 14] 
[ 6 7 8 9 10 11 12 13 14 15] 
[ 7 8 9 10 11 12 13 14 15 16] 
[ 8 9 10 11 12 13 14 15 16 17] 
[ 9 10 11 12 13 14 15 16 17 18]] 
+0

Cette solution est sympa, mais elle n'est pas assez générale pour mettre en joli module d'impression. Bonne réponse à ma première demande de le faire aussi automatiquement que possible. De la mise en page de votre code qui n'est pas repr, j'ai décidé de changer la ligne d'autres à sinon: return str (w) –

3

Vous pouvez écrire:

'\n'.join( # join the lines with '\n' 
     ' '.join( # join one line with ' ' 
       "%2d" % (i + j) # format each item 
     for i in range(10)) 
    for j in range(10)) 
+0

Pas si mal du tout, mais tous les jours impairs je pense toujours qu'il est laid de faire ce genre de trucs pour la concaténation de chaînes de caractères, tous les jours pairs je pense que c'est un super-Pythonic et souriez à moi-même tout en écrivant un tel code Pythonic Clever ('\ n'.joindre au lieu de plusieurs impressions). –

1

En utilisant George Sakkis' table indention recipe:

print(indent(((i + j for i in range(10)) for j in range(10)), 
      delim=' ', justify='right')) 

rendements:

0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 
2 3 4 5 6 7 8 9 10 11 
3 4 5 6 7 8 9 10 11 12 
4 5 6 7 8 9 10 11 12 13 
5 6 7 8 9 10 11 12 13 14 
6 7 8 9 10 11 12 13 14 15 
7 8 9 10 11 12 13 14 15 16 
8 9 10 11 12 13 14 15 16 17 
9 10 11 12 13 14 15 16 17 18 

PS. Pour que cela fonctionne, j'ai apporté une petite modification à la recette. J'ai changé wrapfunc(item)-wrapfunc(str(item)):

def rowWrapper(row): 
    newRows = [wrapfunc(str(item)).split('\n') for item in row] 
+0

Cela semble simple jusqu'à ce que vous regardiez la quantité de code derrière la recette liée. Comparé à par exemple les 9 lignes sans commentaire de mes jolies fonctions. –