あなたの問題を2つの部分に分解します:
- 「フラットリスト」を指定すると、サブリストが指定された長さであり、全体のリストが「行優先」順序 (1 番目と 3 番目の例) または「列優先」 (2 番目の例) のいずれかになるサブリストのリストを生成します例);
- 文字列項目を含むサブリストのリストが与えられると、そこから HTML テーブルが生成されます。
この 2 つのタスクは非常に明確に区別されており、それらをマッシュアップしても得るものは何もありません (失うものも多くありません)。
ポイント 1 については、行優先は簡単です。
def row_major(alist, sublen):
return [alist[i:i+sublen] for i in range(0, len(alist), sublen)]
そして、列優先はそれほど悪くありません:
def col_major(alist, sublen):
numrows = (len(alist)+sublen-1) // sublen
return [alist[i::sublen] for i in range(numrows)]
例えば...:
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
必要な 3 つの結果が生成されます (1 行に 1 つのリスト、まだ HTML 形式ではありません;-)。
問題の後半 -- 文字列のリストのリストから HTML テーブルを作成します。
def html_table(lol):
print '<table>'
for sublist in lol:
print ' <tr><td>'
print ' </td><td>'.join(sublist)
print ' </td></tr>'
print '</table>'
印刷するのではなく単一の文字列として取得する場合は、それぞれprint
をに変更しyield
て使用します'\n'.join(html_table(lol))
。
これで、2 つのシンプルで便利な、使用可能で再利用可能なビルディング ブロックができました。データを HTML テーブル以外の形式で表示したいときや、リストのリストを HTML として表示したいときはいつでも、それらを分離すると便利です。テーブルは、それを構築する他の方法から来ています。アプリケーション コードでそれらをまとめるのは簡単ですが、もちろん単純な「グルー ルーチン」を実行するのも簡単です。たとえば、 と のyield
ベース バージョンを想定しhtml_table
て、単一の文字列の結果が必要な場合は次のようになります。
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))
このビルディング ブロックのアプローチは、ごちゃごちゃした接着剤の大きな塊の観点からプログラミングするよりも、生産的であるだけでなく、本当に素晴らしく、快適ではないでしょうか...?-)