29

次のようなリストがあるとしましょう:

['one','two','three','four','five','six','seven','eight','nine']

そして、このデータをさまざまな次元の HTML テーブルに変換して実験したいと思います。

one     two    three
four    five   six
seven   eight  nine

また

one    four   seven
two    five   eight
three  six    nine

また

one    two   three  four
five   six   seven  eight
nine

クレイジーなリストのスプライシングやネストされた for ループを実行する必要なく、これを処理できるライブラリはありますか? Google で検索したところ、HTML ライブラリがいくつかあることがわかりましたが、それらがテーブルをうまく処理できるかどうかを確認するために、それぞれを調べる時間はありません。誰かがこれをしなければならなかったことがありますか?もしそうなら、どのようにしましたか?

4

7 に答える 7

35

あなたの問題を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))

このビルディング ブロックのアプローチは、ごちゃごちゃした接着剤の大きな塊の観点からプログラミングするよりも、生産的であるだけでなく、本当に素晴らしく、快適ではないでしょうか...?-)

于 2009-09-25T04:36:28.250 に答える
33

集計を使用する

from tabulate import tabulate

table = [['one','two','three'],['four','five','six'],['seven','eight','nine']]

print(tabulate(table, tablefmt='html'))

次の出力が生成されます。

<table>
<tbody>
<tr><td>one  </td><td>two  </td><td>three</td></tr>
<tr><td>four </td><td>five </td><td>six  </td></tr>
<tr><td>seven</td><td>eight</td><td>nine </td></tr>
</tbody>
</table>
于 2019-03-02T22:02:23.783 に答える
11

今後の参考のために、簡単な HTML テーブル生成を提供するsimpletableという小さな Python モジュールを実装しました。また、この質問で説明されている問題も扱います。

使い方は以下のように簡単です。

import simpletable

test_data = [str(x) for x in range(20)]
formatted_data = simpletable.fit_data_to_columns(test_data, 5)
table = simpletable.SimpleTable(formatted_data)
html_page = simpletable.HTMLPage(table)
html_page.save("test_page.html")

サードパーティのパッケージを必要としないため、私のリポジトリからコードを取得してプロジェクトで使用できます。

于 2014-08-06T14:27:49.737 に答える
2

いくつかのテンプレート ライブラリがあります (Genshi は私が気に入っているものの 1 つですが、他にもたくさんあります)。

または、次のようなこともできます。

def print_table(data, row_length):
    print '<table>'
    counter = 0
    for element in data:
        if counter % row_length == 0:
            print '<tr>'
        print '<td>%s</td>' % element
        counter += 1
        if counter % row_length == 0:
            print '</tr>'
    if counter % row_length != 0:
        for i in range(0, row_length - counter % row_length):
            print '<td>&nbsp;</td>'
        print '</tr>'
    print '</table>'
于 2009-09-25T02:33:15.353 に答える
0

おもちゃのコードの場合、テンプレートを操作する方が簡単かもしれません =p

def get_html_tbl(seq, col_count):
    if len(seq) % col_count:
        seq.extend([''] * (col_count - len(seq) % col_count))
    tbl_template = '<table>%s</table>' % ('<tr>%s</tr>' % ('<td>%s</td>' * col_count) * (len(seq)/col_count))
    return tbl_template % tuple(seq)
于 2009-09-25T08:03:23.697 に答える