最后一步! (python调整)

时间:2010-11-10 21:56:08

标签: python join functional-programming

我有这段代码:

        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

我不确定,但似乎我可以以某种方式摆脱最后的循环。不过,我需要一些帮助。

3 个答案:

答案 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))

但是你的第一个例子看起来更漂亮))