2010-11-10 55 views
-1

我有這樣的代碼:最後一步! (蟒蛇調諧)

 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 

我不知道,但好像我可以擺脫不知怎的,最後的循環。不過,我需要一些幫助。

+1

的區別是在速度真的很戲劇化?你的第二塊代碼很難閱讀。 – James 2010-11-10 21:59:16

+0

嘗試一些'map'和'reduce' – 2010-11-10 22:06:46

+2

剖析它,這是您知道是否將它變成理解/使用地圖的唯一方法,值得。 – Xorlev 2010-11-10 22:12:36

回答

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

我不相信結果是值得的努力,但如果你打算去掉所有的for循環以支持理解的路線,你應該注意到你可以使用generator expressions而不是列表解析避免創建(然後丟棄)中間列表。

+0

這正是我發佈這個的原因。學習新的東西。謝謝,Gareth。 – Ramy 2010-11-10 22:14:22

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

但你第一個例子看起來更漂亮))