我有这段代码:
emailRows = []
for rowTuple in listOfRows: #row loop
emailLine = []
for tup in rowTuple: #field loop
emailLine.append(str(tup).center(20))
emailRows.append('\t'.join([field.strip().center(20) for field in emailLine]))
rows = '\n'.join(emailRows)
emailBody = emailBody + rows
我到目前为止已改为此代码:
emailRows = []
for rowTuple in listOfRows: #row loop
emailRows.append('\t'.join([field.strip().center(20) for field in [str(tup).center(20) for tup in rowTuple]]))
rows = '\n'.join(emailRows)
emailBody = emailBody + rows
我不确定,但似乎我可以以某种方式摆脱最后的循环。不过,我需要一些帮助。
答案 0 :(得分:1)
'\n'.join(('\t'.join([field.strip().center(20) for
field in [str(tup).center(20) for
tup in rowTuple]])) for rowTuple in listOfRows)
哇,那是混淆的。我希望cProfile说这个家伙是一个沉重的击球手。
答案 1 :(得分:1)
我不相信结果值得付出努力,但是如果你要沿着消除所有for
循环的路线走向理解,你应该注意到你可以使用{{ 3}}而不是列表推导,以避免创建(然后丢弃)中间列表。
答案 2 :(得分:1)
您可以使用map()
代替for x in seq
:
rows='\n'.join(map(lambda row: '\t'.join(map(lambda cell: str(cell).center(20), row)), listOfRows))
您也可以尝试reduce()
而不是join()
:
def cell_format(cell):
return str(cell).center(20)
def row_format(res, cell):
return res+'\t'+cell
def rows_format(res, row):
return res+'\n'+row
rows=reduce(rows_format,
map(lambda row: reduce(row_format, map(cell_format, row)),
listOfRows))
但是你的第一个例子看起来更漂亮))