我会将您的问题分解为两部分:
- 给定一个“平面列表”,生成一个子列表的列表,其中子列表具有给定的长度,并且整个列表可以按照行或列的方式遍历 (您的第一个和第三个示例是行主序,您的第二个示例是列主序);
- 给定一个由字符串项组成的子列表列表,将其转换为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>'
如果您希望将其作为单个字符串而不是打印出来,请将每个
print
更改为
yield
并使用
'\n'.join(html_table(lol))
。
现在您有两个简单、有用、可用和可重复使用的构建块——将它们分开将在您想要将数据呈现为除HTML表以外的任何形式时非常方便,以及无论以任何其他方式构建要呈现为HTML表的列表,都很容易。将它们组合在一起在应用程序代码中很容易实现,但当然也可以进行简单的“粘合例程”,例如假设基于
yield
版本的
html_table
并且需要单个字符串结果:
def list_to_html_table(alist, sublength, column_major=False):
if column_major:
lol = col_major(alist, sublength)
else:
lol = row_major(alist, sublength)
return ''.join(html_table(lol))
相比于使用纠缠在一起的代码块编程,这种基础模块的方法难道不是更美好、更令人愉悦、更高效吗?-)