我有个人元组列表。我想为每个人生成一个HTML表格。我确定有一种简单的方法可以做到这一点,但我不知道那会是什么。我把一些我认为很接近的代码放在一起,但可能不是一种有效的方法。
期望的输出:
<html>
<table>
<tr><td>Andrew</td><td>10</td><td>20</td></tr>
<tr><td>Andrew</td><td>54</td><td>56</td></tr>
</table>
<table>
<tr><td>Jim</td><td>20</td><td>12</td></tr>
<tr><td>Jim</td><td>23</td><td>15</td></tr>
</table>
<table>
<tr><td>Sarah</td><td>30</td><td>43</td></tr>
</table>
我的代码:
mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
mytuple = sorted(mytuple)
FULL_HTML = ""
for row in mytuple:
individual_count = mytuple.count(row[0])
print individual_count
for row1 in xrange(row, row + individual_count):
HTML_BODY "<tr><td>" + row1[0] + "</td><td>" + row1[1] + "</td><td>" + row1[2] + "</td><td></tr>\n"
FULL_HTML = "<table>\n" _ FULL_HTML + HTML_BODY +"\n</table>\n"
FULL_HTML = "<html>\n" + FULL_HTML + "\n</html>"
print FULL_HTML
答案 0 :(得分:2)
您无法使用list.count()
方法计算名称字符串;你必须循环遍历所有元组并手动计数。无论如何,这两种方法都没有效率。
虽然您可以简单地跟踪上次输出的名称,并在每次遇到新名称时添加</table><table>
行,但更好的选择是使用itertools.groupby()
function让Python为你分组名称:
from itertools import groupby
from operator import itemgetter
mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
mytuple = sorted(mytuple)
FULL_HTML = []
for name, rows in groupby(mytuple, itemgetter(0)):
table = []
for name, value1, value2 in rows:
table.append(
"<tr><td>{}</td><td>{}</td><td>{}</td><td></tr>".format(
name, value1, value2))
table = "<table>\n{}\n</table>".format('\n'.join(table))
FULL_HTML.append(table)
FULL_HTML = "<html>\n{}\n</html>".format('\n'.join(FULL_HTML))
print FULL_HTML
operator.itemgetter()
object选出要分组的每个元组的第一个元素。
演示:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
>>> mytuple = sorted(mytuple)
>>> FULL_HTML = []
>>> for name, rows in groupby(mytuple, itemgetter(0)):
... table = []
... for name, value1, value2 in rows:
... table.append(
... "<tr><td>{}</td><td>{}</td><td>{}</td><td></tr>".format(
... name, value1, value2))
... table = "<table>\n{}\n</table>".format('\n'.join(table))
... FULL_HTML.append(table)
...
>>> FULL_HTML = "<html>\n{}\n</html>".format('\n'.join(FULL_HTML))
>>> print FULL_HTML
<html>
<table>
<tr><td>Andrew</td><td>10</td><td>20</td><td></tr>
<tr><td>Andrew</td><td>54</td><td>56</td><td></tr>
</table>
<table>
<tr><td>Jim</td><td>20</td><td>12</td><td></tr>
<tr><td>Jim</td><td>23</td><td>15</td><td></tr>
</table>
<table>
<tr><td>Sarah</td><td>30</td><td>43</td><td></tr>
</table>
</html>
答案 1 :(得分:0)
考虑使用像Mako(http://www.makotemplates.org/)这样的模板引擎。这很容易,从长远来看会节省很多时间。
答案 2 :(得分:0)
或者,跟进Max Noel关于使用mako
template engine的建议。
使用以下内容创建index.html
文件:
<html>
% for _, rows in data:
<table>
% for row in rows:
<tr>
% for value in row:
<td>${value}</td>
% endfor
</tr>
% endfor
</table>
% endfor
</html>
然后,在你的python代码中,sort和group mytuple
由第一个元素传递给模板:
from itertools import groupby
from operator import itemgetter
from mako.template import Template
mytuple = [('Andrew','10','20'),('Jim',"20",'12'),("Sarah","30",'43'),("Jim","23",'15'),("Andrew","54",'56')]
t = Template(filename='index.html')
print t.render(data=groupby(sorted(mytuple), itemgetter(0)))
打印:
<html>
<table>
<tr>
<td>Andrew</td>
<td>10</td>
<td>20</td>
</tr>
<tr>
<td>Andrew</td>
<td>54</td>
<td>56</td>
</tr>
</table>
<table>
<tr>
<td>Jim</td>
<td>20</td>
<td>12</td>
</tr>
<tr>
<td>Jim</td>
<td>23</td>
<td>15</td>
</tr>
</table>
<table>
<tr>
<td>Sarah</td>
<td>30</td>
<td>43</td>
</tr>
</table>
</html>
答案 3 :(得分:0)
以下是很简单的:
import pandas as pd
df = pd.DataFrame(list(mytuple),columns['name1','name2','name3']) #name1,name2,name3 are coloumn headings
html = df.to_html("index.html")
# Create index.html to write html on it
f = open("index.html","r+")
data = f.read()
&#13;
答案 4 :(得分:0)
@ravi 答案的固定和工作版本,因为由于编辑队列已满,我无法编辑:
import pandas as pd
df = pd.DataFrame(data=list_of_tuples, columns=['name1','name2','name3'])
html_string = df.to_html()