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,
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.
0 Stimmen
Wenn die Herabstufungen auf die anfängliche Verwirrung und die schlechte Formulierung zurückzuführen waren, nehmen Sie sie bitte zurück, da dies inzwischen behoben wurde. Wenn die Herabstufungen aus einem anderen Grund erfolgten, erklären Sie mir bitte, dass ich den Fehler beheben oder zumindest nicht noch einmal machen kann. Ich danke Ihnen.
0 Stimmen
Zu Downvotes: Downvoteure erhalten nach der Abstimmung keine Benachrichtigung über Kommentare :(
0 Stimmen
Re downvotes: Oh. Das ist bedauerlich. Ich kann die Logik, die zu dieser Funktion führt, nachvollziehen, aber es macht es Anfängern schwer, aus dem Loch herauszukommen. Danke für den Hinweis, sonst hätte ich weiterhin schlecht über S. Lott gedacht, weil er es ignoriert hat.
1 Stimmen
Im Jahr 2021 empfehle ich Ihnen, die Antworten von Claudio y Epischer Wink für ihre Verwendung von
columnize
.0 Stimmen
Danke @CameronSmith. Epic Wink's ist direkt und kurz genug, um die akzeptierte Antwort zu ändern, für py3.