2010-11-10 5 views
-1

J'ai ce code:Une dernière étape! (Réglage python)

 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 

que je l'ai changé à ce jour à ce code:

 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 

Je ne sais pas, mais il semble que je peux me débarrasser de le dernier pour la boucle en quelque sorte. J'ai besoin d'aide pour faire ça, cependant.

+1

est la différence vitesse vraiment dramatique? Votre deuxième bloc de code est beaucoup plus difficile à lire. – James

+0

essayez quelques 'map' et' reduce' –

+2

Profil, c'est la seule façon dont vous saurez si le faire dans les compréhensions/l'utilisation de la carte en valait la peine. – Xorlev

Répondre

1
'\n'.join(('\t'.join([field.strip().center(20) for 
    field in [str(tup).center(20) for 
     tup in rowTuple]])) for rowTuple in listOfRows) 

Wow, c'est obfusqué. J'espère que cProfile dit que ce type est un gros frappeur.

1

Je ne suis pas convaincu que le résultat en vaille la peine, mais si vous voulez éliminer toutes vos boucles for en faveur de la compréhension, sachez que vous pouvez utiliser generator expressions au lieu de la liste pour éviter de créer (et ensuite de jeter) des listes intermédiaires.

+0

c'est exactement pourquoi j'ai posté ceci. Pour apprendre quelque chose de nouveau. Merci, Gareth. – Ramy

1

Vous pouvez utiliser map() à la place for x in seq:

rows='\n'.join(map(lambda row: '\t'.join(map(lambda cell: str(cell).center(20), row)), listOfRows)) 

vous pouvez aussi essayer reduce() à la place 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)) 

Mais vous premier exemple ressemble beaucoup plus jolie))

Questions connexes