2010-02-05 8 views
0

Je me retrouve souvent besoin d'appliquer une séquence de fonctions unaires à une séquence de la même longueur. Ma première pensée est d'aller avec map(), mais cela ne prend qu'une seule fonction à appliquer à tous les éléments de la séquence.Transformer les éléments de itérables avec une suite de fonctions unaires

Dans le code suivant, par exemple, je souhaite appliquer str.upper() au premier élément et int au deuxième élément de chaque a. "transform" est un espace réservé pour l'effet que je suis après.

COLS = tuple([transform((str.upper, int), a.split(",")) for a in "pid,5 user,8 program,28 dev,10 sent,9 received,15".split()]) 

Y a-t-il une bibliothèque standard ou une autre implémentation sympa qui peut effectuer une transformation comme celle-ci?

+1

Il n'y a rien de mal à cette question, mais je voudrais faire des folies et acheter une ligne supplémentaire de code pour cela. Divisé les dossiers et leurs champs sur la ligne 1, finition rangement sur la ligne 2. En d'autres termes, la chose que vous avez choisi de factoriser est pas ce que je l'aurais choisi. –

Répondre

3

Qu'en est-il ...:

def transform(functions, arguments): 
    return [f(a) for f, a in zip(functions, arguments)] 
+0

fait il ne –

1
>>> s="pid,5 user,8 program,28 dev,10 sent,9 received,15".split() 
>>> [ (m.upper(),int(n)) for m, n in [i.split(",") for i in s ] ] 
[('PID', 5), ('USER', 8), ('PROGRAM', 28), ('DEV', 10), ('SENT', 9), ('RECEIVED', 15)] 
1

J'utilise actuellement ceci:

def transform(unaries, iterable): 
    return map(lambda a, b: a(b), unaries, iterable) 
+0

Comment cette relation effectuer avec la réponse d'Alex Martelli, qui semble un peu plus simple? –