Ich würde Ihr Problem in zwei Teile zerlegen:
- aus einer "flachen Liste" eine Liste von Teillisten erstellen, wobei die Teillisten eine bestimmte Länge haben und die Gesamtliste entweder in eine "zeilenmäßige" (Ihr erstes und drittes Beispiel) oder "spaltenmäßige" (Ihr zweites Beispiel) Reihenfolge gebracht werden kann;
- aus einer Liste von Unterlisten mit String-Elementen eine HTML-Tabelle erstellen.
Ich denke, die beiden Aufgaben sind wirklich sehr unterschiedlich und es gibt nichts zu gewinnen (und viel zu verlieren), wenn man sie vermischt, daher wäre ich erstaunt, wenn eine gut konzipierte Bibliothek eine solche Vermischung vornimmt.
Für Punkt 1 ist der Zeilen-Dur einfach:
def row_major(alist, sublen):
return [alist[i:i+sublen] for i in range(0, len(alist), sublen)]
und Kolumne-major nicht so schlecht:
def col_major(alist, sublen):
numrows = (len(alist)+sublen-1) // sublen
return [alist[i::sublen] for i in range(numrows)]
zum Beispiel ...:
L = ['one','two','three','four','five','six','seven','eight','nine']
for r in row_major(L, 3): print r
print
for r in col_major(L, 3): print r
for r in row_major(L, 4): print r
liefert die drei gewünschten Ergebnisse (eine Liste pro Zeile, noch nicht in HTML-Form;-).
Die zweite Hälfte des Problems - Erstellen einer HTML-Tabelle aus einer Liste von Listen von Zeichenketten:
def html_table(lol):
print '<table>'
for sublist in lol:
print ' <tr><td>'
print ' </td><td>'.join(sublist)
print ' </td></tr>'
print '</table>'
Wenn Sie sie als einzelne Zeichenkette erhalten möchten, anstatt sie auszudrucken, ändern Sie jede print
in yield
und verwenden '\n'.join(html_table(lol))
.
Jetzt haben Sie zwei einfache, nützliche, brauchbare und wiederverwendbare Bausteine - sie getrennt zu haben wird immer dann nützlich sein, wenn Sie Ihre Daten als etwas anderes als eine HTML-Tabelle darstellen wollen, und auch immer dann, wenn die Liste der Listen, die Sie als HTML-Tabelle darstellen wollen, von einer anderen Art der Erstellung stammt. Es ist einfach, sie in Ihrem Anwendungscode zusammenzufügen, aber natürlich ist es auch einfach, eine einfache "Kleberoutine" zu erstellen, z.B. indem man die yield
-basierten Version von html_table
und dass ein einzelnes String-Ergebnis gewünscht wird:
def list_to_html_table(alist, sublength, column_major=False):
if column_major:
lol = col_major(alist, sublength)
else:
lol = row_major(alist, sublength)
return ''.join(html_table(lol))
Ist dieser Baustein-Ansatz nicht viel schöner und angenehmer und auch produktiver als das Programmieren in Form von großen Klecksen...?-)