bym rozłożenia problemu na dwie części:
- otrzymał „płaska lista”, produkują listę podlist gdzie na listach podrzędnych są dana długość i ogólna lista mogą być wprowadzane albo w kolejności "rzędu głównego" (twój pierwszy i trzeci przykład), albo "kolumny głównej" (twój drugi przykład);
- biorąc pod uwagę listę podlisty z elementami tekstowymi, wytworzy z niej tabelę HTML.
Sądzę, że te dwa zadania są naprawdę bardzo wyraźne i nie ma nic do zyskania (i wiele do stracenia), aby je zmusić, więc byłbym zdziwiony, gdyby jakakolwiek dobrze zaprojektowana biblioteka zrobiła takie mushing.
Do pkt 1, wiersz-dur jest proste:
def row_major(alist, sublen):
return [alist[i:i+sublen] for i in range(0, len(alist), sublen)]
i kolumna-major nie jest tak źle:
def col_major(alist, sublen):
numrows = (len(alist)+sublen-1) // sublen
return [alist[i::sublen] for i in range(numrows)]
... na przykład:
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
produkuje trzy pożądane wyniki (jedna lista na wiersz, nie w formie HTML ;-).
Druga połowa problemu - produkować tabelę HTML z listy list ciągów:
def html_table(lol):
print '<table>'
for sublist in lol:
print ' <tr><td>'
print ' </td><td>'.join(sublist)
print ' </td></tr>'
print '</table>'
Jeśli chcesz dostać go jako pojedynczy ciąg zamiast wydrukować go, zmienić każdy print
do yield
i użyj '\n'.join(html_table(lol))
.
Teraz masz dwa proste, użyteczne, użyteczne i wielokrotnego użytku bloki konstrukcyjne - ich oddzielne przydadzą się, gdy chcesz zaprezentować swoje dane jako wszystko, ALE tabelę HTML, a także zawsze, gdy lista list do obecny jako tabela HTML pochodzi z dowolnego innego sposobu jego budowania.Zestawiając je łatwo zrobić w kodzie aplikacji, ale oczywiście jest to również łatwe do zrobienia prostego „rutynowych klej”, na przykład zakładając yield
opartych wersję html_table
i że jest pożądany pojedynczy wynik ciąg:
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))
nie Czy ten budynek bloki podejść naprawdę ładniejszy i bardziej przyjemne, jak również bardziej wydajne, niż programowanie w zakresie dużych plamy mushed-up kleju ... -?)
PO chciał uniknąć zagnieżdżenia dla pętli. Więc może być wprowadzenie do mapy (lambda) jest w porządku. – whatnick
@whatnick - Czy widzisz pętlę wewnątrz pętli? Ja nie. –
Tylko jedna pętla. – whatnick