我会把你的问题分成两部分:给定一个“平面列表”,生成一个子列表列表,其中子列表具有给定的长度,并且整个列表可以按“行主要”顺序(第一个和第三个示例)或“列主要”(第二个示例)排列
给定一个包含字符串项的子列表列表,从中生成一个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
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 '
for sublist in lol:
print '
'print '
'.join(sublist)print '
'print '
'如果希望将其作为单个字符串而不是打印出来,请将每个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))
这种构建块的方法真的比用大块的糊状胶水来编程更好、更愉快、更高效吗。。。?-)