36 Stimmen

Wie kann man eine Liste schöner drucken?

Dies ist vergleichbar mit Wie man eine Liste in Python "schön" ausdruckt aber ich würde die Liste gerne noch schöner ausdrucken - ohne die Klammern, Apostrophe und Kommas, und noch besser in Spalten.

foolist = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf', 
    'pdcurses-devel',     'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
    'qgis1.1', 'php_mapscript']

evenNicerPrint(foolist)

Erwünschtes Ergebnis:

exiv2-devel       msvcrt        
mingw-libs        gdal-grass    
tcltk-demos       iconv         
fcgi              qgis-devel    
netcdf            qgis1.1       
pdcurses-devel    php_mapscript 

Danke!

1 Stimmen

Erstens ist es keine gute Idee, dict als Variablennamen zu verwenden. Zweitens ist das, was Sie hier zu drucken versuchen, eine Liste, ein dict verwendet {} und :, um die Schlüssel und Werte zu trennen

3 Stimmen

-1: Im Titel der Frage steht "Liste" - eine komplette Verdoppelung. In der Frage steht "dict". Der Beispielcode ist eine Liste - eine komplette Verdoppelung. Möchten Sie, dass die Liste in ein Diktat umgewandelt und ausgedruckt wird? Wenn ja, ändern Sie die Frage, um zu beschreiben, was Sie vraiment wollen.

0 Stimmen

Ich habe die Beschreibung und den Beispielcode wie empfohlen korrigiert. Der Titel und die Beschreibung spiegeln jetzt mein Ziel wider. Vielen Dank für die Korrekturen.

5voto

gimel Punkte 78080

Siehe formatieren einer textliste in spalten ,

Eine allgemeine Lösung, die mit einer beliebigen Anzahl von Spalten und ungeraden Listen arbeitet. Tabulatorzeichen trennen die Spalten, wobei Generatorausdrücke verwendet werden, um Platz zu sparen.

def fmtcols(mylist, cols):
    lines = ("\t".join(mylist[i:i+cols]) for i in xrange(0,len(mylist),cols))
    return '\n'.join(lines)

0 Stimmen

Horizontale Anordnung, wahrscheinlich ist das nicht das, was Sie wollen

3voto

Claudio Punkte 877

Ich verwende IPython intern Funktion spalten

import IPython
foolist = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf', 
           'pdcurses-devel', 'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
           'qgis1.1', 'php_mapscript']

foolist_columnized = IPython.utils.text.columnize(foolist)
print(foolist_columnized)

Die Ausgabe wird wie folgt aussehen:

exiv2-devel  tcltk-demos  netcdf          msvcrt      iconv       qgis1.1
mingw-libs   fcgi         pdcurses-devel  gdal-grass  qgis-devel  php_mapscript

3voto

John La Rooy Punkte 278961

Wenn die Daten in dem von Ihnen angegebenen Format vorliegen, ist es ein wenig mehr Arbeit

>>> d = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf', 
...     'pdcurses-devel',     'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
...     'qgis1.1', 'php_mapscript']
>>> print "\n".join("%-20s %s"%(d[i],d[i+len(d)/2]) for i in range(len(d)/2))
exiv2-devel          msvcrt
mingw-libs           gdal-grass
tcltk-demos          iconv
fcgi                 qgis-devel
netcdf               qgis1.1
pdcurses-devel       php_mapscript

1voto

nimig18 Punkte 637

Hier ist die kurze und einfache Methode :

def printList1(list, col, STR_FMT='{}', gap=1):
    list = [STR_FMT.format(x).lstrip() for x in list]
    FMT2 = '%%%ds%%s' % (max(len(x) for x in list)+gap)
    print(''.join([FMT2 % (v, "" if (i+1) % col else "\n") for i, v in enumerate(list)]))

Dann ist hier die besser Methode, die die konstante Breite über die gesamte Liste ausschalten kann, anstatt sie über die Spalten zu optimieren, die Anzahl der Spalten zu beschränken, um die maximalen Zeichen pro Zeile zu passen, oder die optimale Anzahl von Spalten zu finden, um die maximalen Zeichen pro Zeile zu passen, dann links- oder rechtsbündig zu erzwingen, und kann immer noch die optionale Formatzeichenfolge und die Lückenbreite zwischen jeder Spalte nehmen.

def printList2(list, col=None, gap=2, uniform=True, ljust=True, STR_FMT="{}", MAX_CHARS=120, end='\n'):
   list = [STR_FMT.format(x).strip() for x in list]
   Lmax, valid, valid_prev, cp, c = [MAX_CHARS+1], None, None, 1, max(col,1) if col else 1
   LoL_prev, Lmax_prev = [], []

   while True:
       LoL = [list[i::c] for i in range(c)]
       Lmax = [max(len(x)+gap for x in L) for L in LoL]    # Find max width of each column with gap width
       if uniform:                                         # Set each max column width to max across entire set.
           Lmax = [max(Lmax) for m in Lmax]

       valid_prev, valid = valid, sum(Lmax) <= MAX_CHARS

       if (col and (valid or (c == 1))) or not MAX_CHARS:  # If column and valid strlen or MAX_CHARS is empty
           break
       elif valid_prev and not valid_prev == valid:        # If valid_prev exist
           c = cp if valid_prev and not valid else c
           LoL, Lmax = (LoL_prev, Lmax_prev) if valid_prev else (LoL, Lmax)
           break

       LoL_prev, Lmax_prev = LoL, Lmax
       cp, c = c, (c + (+1 if valid else -1))

   ljust = '-' if ljust else ''
   FMT = ["%%%s%ds%s" % (ljust, max(Lmax) if uniform else m, end if i+1 == c else '') for i, m in enumerate(Lmax)]
   outStr = ''.join([''.join([f % v for v, f in zip(L, FMT)]) for L in zip(*LoL)])
   remStr = ''.join([f % v for v, f in zip(list[c * (len(list) // c):], FMT)])
   print(outStr+(remStr+end if remStr else remStr), end='')

Prüfung mit Ausgängen:

>>> foolist = ['exiv2-devel', 'mingw-libs', 'tcltk-demos', 'fcgi', 'netcdf',
             'pdcurses-devel', 'msvcrt', 'gdal-grass', 'iconv', 'qgis-devel', 
             'qgis1.1', 'php_mapscript']
>>> printList2(foolist)
exiv2-devel     mingw-libs      tcltk-demos     fcgi            netcdf          pdcurses-devel  msvcrt          
gdal-grass      iconv           qgis-devel      qgis1.1         php_mapscript   

>>> printList2(foolist, MAX_CHARS=48, uniform=False, gap=3)
exiv2-devel   mingw-libs   tcltk-demos      
fcgi          netcdf       pdcurses-devel   
msvcrt        gdal-grass   iconv            
qgis-devel    qgis1.1      php_mapscript    

>>> printList2(foolist, col=2, MAX_CHARS=48, uniform=False, gap=3)
exiv2-devel   mingw-libs       
tcltk-demos   fcgi             
netcdf        pdcurses-devel   
msvcrt        gdal-grass       
iconv         qgis-devel       
qgis1.1       php_mapscript    

>>> printList2(foolist, col=2, MAX_CHARS=48, uniform=False, ljust=False, gap=2)
  exiv2-devel      mingw-libs
  tcltk-demos            fcgi
       netcdf  pdcurses-devel
       msvcrt      gdal-grass
        iconv      qgis-devel
      qgis1.1   php_mapscript

>>> printList2(foolist, col=10, MAX_CHARS=48, uniform=True, ljust=False, gap=2)
     exiv2-devel      mingw-libs     tcltk-demos
            fcgi          netcdf  pdcurses-devel
          msvcrt      gdal-grass           iconv
      qgis-devel         qgis1.1   php_mapscript

>>> from math import pi
>>> FloatList = [pi**(i+1) for i in range(32)]
>>> printList2(FloatList, STR_FMT="{:.5g},", col=7, ljust=False)
      3.1416,      9.8696,      31.006,      97.409,      306.02,      961.39,      3020.3,
      9488.5,       29809,       93648,   2.942e+05,  9.2427e+05,  2.9037e+06,  9.1222e+06,
  2.8658e+07,  9.0032e+07,  2.8284e+08,  8.8858e+08,  2.7916e+09,    8.77e+09,  2.7552e+10,
  8.6556e+10,  2.7192e+11,  8.5427e+11,  2.6838e+12,  8.4313e+12,  2.6488e+13,  8.3214e+13,
  2.6142e+14,  8.2129e+14,  2.5802e+15,  8.1058e+15,

1voto

Greg von Winckel Punkte 2151

Wie wäre es mit etwas wie diesem?

def strlistToColumns( strl, maxWidth, spacing=4 ):

longest = max([len(s) for s in strl])
width = longest+spacing

# compute numCols s.t. (numCols-1)*(longest+spacing)+longest < maxWidth
numCols = 1 + (maxWidth-longest)//width
C = range(numCols)

# If len(strl) does not have a multiple of numCols, pad it with empty strings
strl += [""]*(len(strl) % numCols)
numRows = len(strl)/numCols
colString = ''

for r in range(numRows):
    colString += "".join(["{"+str(c)+":"+str(width)+"}" \
        for c in C]+["\n"]).format(*(strl[numCols*r+c] \
        for c in C))

return colString 

if __name__ == '__main__':

fruits = ['apple', 'banana', 'cantaloupe', 'durian', 'elderberry',         \
          'fig', 'grapefruit', 'honeydew', 'indonesian lime', 'jackfruit', \
          'kiwi', 'lychee', 'mango', 'orange', 'pomegranate', 'quince',    \
          'raspberry', 'tangerine', 'ugli fruit', 'watermelon', 'xigua',
          'yangmei', 'zinfandel grape']

cols = strlistToColumns( fruits, 80 )

print(cols)

Ausgabe

apple              banana             cantaloupe         durian
elderberry         fig                grapefruit         honeydew
indonesian lime    jackfruit          kiwi               lychee
mango              orange             pomegranate        quince
raspberry          tangerine          ugli fruit         watermelon
xigua              yangmei            zinfandel grape

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X