需要更高效的Python循环

时间:2014-12-09 20:52:45

标签: python python-2.7

我目前正在为4个不同元组的4个表创建HTML代码,然后打印出整个HTML。我通过循环遍历4个独立循环中的表来完成此操作。我必须使用4个单独的循环,因为表标签和列引用是不同的。我正在寻找一些提高效率的建议(可能会合并到一个循环)。在下面的例子中,每个元组只有一行,因为它只是一个样本,但是当我实际编码时,会有很多行。

我的代码:

datatable1 = [('A', 'B', 'C', 'D', 'E', 'F','G')]
datatable2 = [('H', 'I', 'J', 'K', 'L', 'M','N')]
datatable3 = [('O', 'P', 'Q', 'R', 'S', 'T','U')]
datatable4 = [('W', 'X', 'Y', 'Z')]

HTML_Body1 = "Table1<BR><table>"    
for row in datatable1:
    HTML_Body1 = HTML_Body1 + "<tr><td><font size='2'><td>" + row[0] + "</td><td>" + row[1] + "</td><td><font size='2'>" + row[6] + "</td><td>" + row[4] + "</td></tr>"
HTML_Body1 = HTML_Body1 + "</table><BR><BR>"

HTML_Body2 = "Table2<BR><table>"
for row in datatable2:
    HTML_Body2 = HTML_Body2 + "<tr><td><font size='2'><td>" + row[0] + "</td><td>" + row[1] + "</td><td><font size='2'>" + row[6] + "</td><td>" + row[4] + "</td></tr>"
HTML_Body2 = HTML_Body2 + "</table><BR><BR>"

HTML_Body3 = "Table3<BR><table>"
for row in datatable3:
    HTML_Body3 = HTML_Body3 + "<tr><td><font size='2'><td>" + row[1] + "</td><td>" + row[2] + "</td><td><font size='2'>" + row[3] + "</td><td>" + row[0] + "</td></tr>"
HTML_Body3 = HTML_Body3 + "</table><BR><BR>"

HTML_Body4 = "Table4<BR><table>"    
for row in datatable4:
    HTML_Body4 = HTML_Body4 + "<tr><td><font size='2'><td>" + row[1] + "</td><td>" + row[2] + "</td><td><font size='2'>" + row[3] + "</td><td>" + row[0] + "</td></tr>"
HTML_Body4 = HTML_Body4 + "</table><BR><BR>"

Entire_HTML = "<HMTL>" + HTML_Body1 + HTML_Body2 + HTML_Body3 + HTML_Body4 + "</HTML>"

print Entire_HTML

2 个答案:

答案 0 :(得分:2)

如果您使每个数据表对象更复杂一些,您可以更轻松地处理它们。

 datatables = [
     { 'header' : 'Table1', 'rows' : [('A', 'B', 'C', 'D', 'E', 'F','G')], 'want_cols' : (0,1,6,4) },
     { 'header' : 'Table2', 'rows' : [('H', 'I', 'J', 'K', 'L', 'M','N')], 'want_cols' : (0,1,6,4) },
     { 'header' : 'Table3', 'rows' : [('O', 'P', 'Q', 'R', 'S', 'T','U')], 'want_cols' : (1,2,3,0) },
     { 'header' : 'Table4', 'rows' : [('W', 'X', 'Y', 'Z')], 'want_cols' : (1,2,3,0) },
 ]

 output_html = ''
 for tbl in datatables:
      table_html = '{}<br/><table>'.format(tbl['header'])
      for row in tbl['rows']:
          table_html += '\n'.join(
               ['<tr><td>{}</tr></td>'.format(row[index]) for index in tbl['want_cols']]
          )
      table_html += '\n</table>'

      output_html += table_html

可以进一步改进:

  • for row in tbl['rows']:替换为嵌套列表解析。
  • 使用带有标题和行属性的DataTable类而不是字典。
  • 如果数据表的目的主要是表示性的,那么你可以在类定义中包含一个asHtmlTable()方法,将表组装成一个几乎以声明方式声明的更大的HTML。

答案 1 :(得分:0)

作为第一步,你可以重构表格的头部,行和尾部

def table_open(title):
    return title + "<BR><table>"

def table_row(d1, d2, d3, d4):
    return "<tr><font size='2'><td>" + d1 + "</td><td>" + d2 + "</td><td><font size='2'>" + d3 + "</td><td>" + d4 + "</td></tr>"

def table_close():
    return "</table><BR><BR>"

并改为使用

tr = ''
for row in datatable1:
    tr = tr + table_row(row[0], row[1], row[6], row[4])

HTML_Body1 = table_open("Table1") + tr + table_close()

更紧凑的形式是

tr = [table_row(row[0], row[1], row[6], row[4]) for row in datatable1]
HTML_Body1 = table_open("Table1") + ''.join(tr) + table_close()

首先捕获行并在之后连接它们。