2014-12-09 3 views
0

В настоящее время я создаю HTML-код для 4 таблиц из 4 разных кортежей, а затем распечатываю весь HTML. Я делаю это, перебирая таблицы в 4 отдельных циклах. Я должен использовать 4 отдельных цикла, потому что метки таблиц и ссылки столбцов различны. Я ищу некоторые предложения по повышению эффективности этого (возможно, объединение до одного цикла). В приведенном ниже примере каждый кортеж имеет только одну строку, так как это всего лишь образец, но когда я на самом деле его кодирую, будет много строк.Нужна более эффективная петля Python

Мой код:

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 
+1

Есть ли какое-либо правило для того, как вы выбираете, какие значения '' 'row''' попадают в таблицу? – wnnmaw

+3

Когда вы говорите «эффективность», вы ищете быстрый код или читаемый код? – Kevin

+1

Среди других проблем этот код не будет работать, если вы добавите несколько строк в список, поскольку каждый цикл сохраняет только самую последнюю строку, которую вы обрабатываете в этом цикле. Возможно, вы хотите перенести первую и последнюю строку каждого тела цикла за пределы цикла. –

ответ

2

Если вы делаете каждый DataTable объект немного более сложным, вы можете обработать их более легко.

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 почти декларативной по стилю.
+0

Это приводит к синтаксической ошибке в следующей строке: 'table_html = '{}

' .format tbl ['header']'. Кроме того, похоже, что это будет включать все столбцы для каждой таблицы, а не конкретные детализированные в OP. – user2242044

+0

Я положил parens обратно на вызов format(). Тем не менее, вы правы, что OP не запрашивает все колонки в порядке, я исправлю это через минуту. –

+0

Я добавил дополнительное свойство для каждого словаря, чтобы контролировать, какие столбцы выводятся в каком порядке. –

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() 

, который захватывает строки и конкатенирует их впоследствии.

Смежные вопросы