次のようなリストがあるとしましょう:
['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ループを必要とせずにこれを処理できるライブラリはありますか?私のグーグル検索は、いくつかのHTMLライブラリがあることを明らかにしましたが、それらがテーブルを非常にうまく処理できるかどうかを確認するために、それぞれを調べる時間はありません。誰かがこれをしなければならなかったことがありますか?もしそうなら、あなたはそれをどのように行いましたか?
私はあなたの問題を2つの部分に分解します:
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つのリスト、まだ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))
_
このビルディングブロックアプローチは、まとまった接着剤の大きな塊の点でプログラミングするよりも、実際に優れており、生産性が高いだけでなく...?-)
将来の参照のために、簡単なHTMLテーブルの生成を提供するために、小さなPython(simpletableというモジュール)を実装しました。この質問で説明されている問題を扱います。
使い方は以下のように簡単です:
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")
サードパーティのパッケージを必要としないため、コードを my repository から取得し、プロジェクトで使用できます。
tabulate を使用します
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>
周りにはいくつかのテンプレートライブラリがあります(Genshiは私が好きなライブラリですが、他にもたくさんあります)。
または、次のようなこともできます。
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> </td>'
print '</tr>'
print '</table>'
これは以前に回答されていますが、ここではnumpyとpandas DataFrame。今日多くの人がデータサイエンスに興味を持っているので、pandasを使用してこれを解決するのは楽しいだろうと思いました:
ギブソリューション:
ソリューション を my GitHubリポジトリ で入手できるようにしました。これは、Google Colaboratoryで実行および探索することもできます(これを強くお勧めします).
ここで使用したカスタム関数(generate_html_with_table()
)は、これで利用できます Jupyter Notebook 。
解決:
ソリューションを取得するには、次を実行します:
data = ['one','two','three','four','five','six','seven','eight','nine']
columns = 4 # Number of Columns
columns_or_rows = columns
column_name_prefix = 'Column' # Prefix for Column headers
span_axis = 1 # Span along a row (1) or a column (0) first
showOutput = True # Use False to suppress printing output
# Generate HTML
data_html, data_df = generate_html_with_table(data, columns_or_rows, column_name_prefix, span_axis, showOutput)
出力:
HTML Generated:
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Column_0</th>
<th>Column_1</th>
<th>Column_2</th>
<th>Column_3</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>one</td>
<td>two</td>
<td>three</td>
<td>four</td>
</tr>
<tr>
<th>1</th>
<td>five</td>
<td>six</td>
<td>seven</td>
<td>eight</td>
</tr>
<tr>
<th>2</th>
<td>nine</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
たぶん、テンプレートを操作することは、おもちゃのコードにとっては簡単です、= 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)
別の選択肢はかなり良いです:
from prettytable import PrettyTable
pt = PrettyTable()
hTML形式を生成する場合:
print(pt.get_html_string())
aSCII形式のテーブルのみを生成する場合:
print(pt.get_string())
plsは公式ドキュメントを参照します: https://ptable.readthedocs.io/en/latest/tutorial.html オプションの詳細については、たとえば、さまざまな種類のスタイルを有効にします。
楽しい。