在python中将列表转换为HTML表的最简单方法是什么?
假设我有一个这样的列表:在python中将列表转换为HTML表的最简单方法是什么?,python,html-table,html-generation,Python,Html Table,Html Generation,假设我有一个这样的列表: ['one','two','three','four','five','six','seven','eight','nine'] 我想尝试将这些数据转换成不同维度的HTML表格: one two three four five six seven eight nine 或 或 有没有一个库可以处理这个问题,而无需执行疯狂的列表拼接或嵌套for循环?我的谷歌搜索显示有几个HTML库,但我没有时间逐一查看它们是否能很好地处理表。有人必须这样
['one','two','three','four','five','six','seven','eight','nine']
我想尝试将这些数据转换成不同维度的HTML表格:
one two three
four five six
seven eight nine
或
或
有没有一个库可以处理这个问题,而无需执行疯狂的列表拼接或嵌套for循环?我的谷歌搜索显示有几个HTML库,但我没有时间逐一查看它们是否能很好地处理表。有人必须这样做吗?如果是这样的话,你是怎么做到的?好吧,有几个模板库(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>'
def打印表格(数据,行长):
打印“
计数器=0
对于数据中的元素:
如果计数器%row_length==0:
打印“
打印“%s”元素
计数器+=1
如果计数器%row_length==0:
打印“
如果计数器%row_length!=0:
对于范围内的i(0,行长度-计数器%行长度):
打印“
打印“
打印“
我会将您的问题分解为两部分:
- 给定一个“平面列表”,生成一个子列表列表,其中子列表具有给定的长度,整个列表可以按“行主”顺序排列(第一个和第三个示例)或“列主”(第二个示例)李>
- 给定一个包含字符串项的子列表,从中生成一个HTML表
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
生成三个所需的结果(每行一个列表,尚未采用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>'
这种构建块的方法真的比用大团糊状胶水编程更好、更愉快、更高效吗…?-)也许操作模板对于玩具代码更容易,=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)
def get_html_tbl(顺序、列计数):
如果长度(顺序)%列计数:
序列扩展(['']*(列计数-列(序列)%列计数))
tbl_模板=“%s”(“%s”(“%s”*列数)*(列(序号)/列数))
返回tbl_模板%tuple(seq)
仅供将来参考,我实现了一个名为simpletable的小型Python模块,以提供简单的HTML表生成。它还涉及本问题所述的问题
用法如下所示:
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")
由于它不需要第三方软件包,您只需从中获取代码并在项目中使用即可。虽然这一点以前已经得到了回答,但这里有另一个解决方案,可以使用numpy和pandas DataFrame。由于现在很多人对数据科学感兴趣,我认为使用熊猫解决这个问题会很有趣: GITHUB解决方案:
我已经提供了我的服务,您也可以在Google Colaboratory中运行和探索(我强烈建议这样做) 我在这里使用的自定义函数(
generate_html_with_table()
)在这里可用
解决方案:要获得解决方案,请运行以下操作: 输出:
HTML生成:
第0列
第1列
第2列
第3栏
0
一
二
三
四
1.
五
六
七
八
2.
九
使用
从表格导入表格
表=['1','2','3',['4','5','6',['7','8','9']]
打印(制表(table,tablefmt='html'))
它将生成以下输出
123
456
七九
另一个选择是prettytable:
from prettytable import PrettyTable
pt = PrettyTable()
如果要生成html格式:
print(pt.get_html_string())
如果仅生成ascii格式表:
print(pt.get_string())
请参考官方文件:更多选项,例如启用不同类型的样式
享受。OP确实希望避免嵌套for循环。所以可能需要对map(lambda)进行介绍。@whatnick-在循环中看到循环了吗?我不喜欢。。我添加了prettytable作为另一个选项。最简单、最少的代码行。这应该是最好的回答太好了!很棒的项目正是我想要的。(我需要将一个对象列表打印到一个html表格中以便发送电子邮件)您能否展示一下如何使用字符串列表的yield来实现这一点,例如[['e1'、'f1']、['e2'、'f2']]。你需要退货。
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>
from prettytable import PrettyTable
pt = PrettyTable()
print(pt.get_html_string())
print(pt.get_string())