Ich find's auch interessant, sonst hätt ich den Thread nicht gemacht... Ich habe die Ausgabe von deiner Funktion direkt im selben Verzeichnis mit ls verglichen und ls bringt in gewissen Fällen immer mal eine Spalte mehr unter als deine Funktion. Zum ausgiebigen Testen solltest du dir wohl eine Windows-Version von ls installieren, da das Frage-Antwort-Spiel zwar nicht direkt nervig, aber doch recht ineffektiv ist.
Ich habe jetzt mal eine objektorientierte Implementierung angefangen, die den Vorstellungen aber bisher nur rudimentär entspricht. Es ging mir dort erstmal um die Lesbarkeit und weniger um Geschwindigkeit, da ich durch die bisher gezeigten Funktionen kaum durchgeblickt habe und sie auch nicht sonderlich schön fand. Das habe ich bis jetzt:
Code: Alles auswählen
from curses import setupterm, tigetnum
class Columnizer(object):
def __init__(self, indent=2, width=None):
self.spacer = indent * ' '
self.width = width
def drop_overage(self, strings):
if self.width is None:
setupterm()
width = tigetnum('cols')
else:
width = self.width
while len(self.spacer.join(strings)) > width:
strings = strings[:-1]
return strings
def make_lines(self, strings):
lines = []
while strings:
remaining = self.drop_overage(strings)
lines.append(remaining)
strings = strings[len(remaining):]
return lines
Werde das erstmal so belassen, da ich morgen leider früh raus muss. TODO ist halt, die Spaltenbreite einheitlich zu bekommen unter der Beachtung, dass einzelne Elemente dann in die nächste Spalte rutschen können und sich damit wieder alles nachfolgende ändert. Wenn man das Glück hat, dass der längste Eintrag ziemlich am Schluss ist, hat man sicher noch mehr Spass.
