Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将列表转换为HTML表的最简单方法是什么?_Python_Html Table_Html Generation - Fatal编程技术网

在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>&nbsp;</td>'
        print '</tr>'
    print '</table>'
def打印表格(数据,行长):
打印“
计数器=0
对于数据中的元素:
如果计数器%row_length==0:
打印“
打印“%s”元素
计数器+=1
如果计数器%row_length==0:
打印“
如果计数器%row_length!=0:
对于范围内的i(0,行长度-计数器%行长度):
打印“
打印“
打印“

我会将您的问题分解为两部分:

  • 给定一个“平面列表”,生成一个子列表列表,其中子列表具有给定的长度,整个列表可以按“行主”顺序排列(第一个和第三个示例)或“列主”(第二个示例)
  • 给定一个包含字符串项的子列表,从中生成一个HTML表
我认为这两个任务是非常不同的,把它们混在一起不会有什么好处(也不会有太多损失),所以如果有一个设计良好的库能够做到这一点,我会感到惊讶

对于第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
生成三个所需的结果(每行一个列表,尚未采用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")

由于它不需要第三方软件包,您只需从中获取代码并在项目中使用即可。

虽然这一点以前已经得到了回答,但这里有另一个解决方案,可以使用numpypandas 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())