我会将您的问题分解为两部分:
- 给定一个“平面列表”,生成一个子列表列表,其中子列表具有给定长度,并且整个列表可以按“行专业”顺序(您的第一个和第三个示例)或“列专业”(您的第二个例子);
- 给定一个包含字符串项的子列表列表,从中生成一个 HTML 表格。
我认为这两个任务非常不同,将它们混合起来并没有什么好处(也没有什么可失去的),所以如果有任何设计良好的库进行这种混合,我会感到惊讶。
对于第 1 点,row-major 很简单:
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 时,将它们分开就会派上用场table 来自任何其他构建它的方式。在您的应用程序代码中将它们放在一起很容易,但当然也很容易做一个简单的“粘合例程”,例如,假设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))
这种构建块方法不是真的比用大块糊状胶水编程更好、更愉快、更有效率吗……?-)