2010-10-03 4 views
2

J'ai le code Python suivant:Comment mapper un tuple de données à un tuple de fonctions?

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

Comment appeler toutes les fonctions avec les données de l'indice correspondant comme argument à la fonction? Maintenant, je suis en utilisant le code:

result = [] 
for i, func in enumerate(funcs): 
    result.append(func(data[i])) 

carte (funcs, données) ne fonctionnent pas avec la fonction tuple (Y at-il fonction BUILTIN faire simple

Répondre

8

Vous pourriez use zip *? de combiner plusieurs séquences ensemble:

zip([a,b,c,...], [x,y,z,...]) == [(a,x), (b,y), (c,z), ...] 

alors vous pouvez itérer sur cette nouvelle séquence et faire de chaque fonction appliquer sur les données correspondantes Puisque vous voulez juste de les rassembler dans une liste,.est beaucoup mieux qu'une boucle for:

result = [f(x) for f, x in zip(funcs, data)] 

Note:. * Utilisez itertools.izip si vous utilisez Python 2.x et les listes sont très longues)

2

[f(d) for d,f in zip(data, funcs)]

2
>>> data = ['1', '4.6', 'txt'] 
>>> funcs = [int, float, str] 
>>> result = [funcs[pos](x) for pos, x in enumerate(data)] 
>>> result 
[1, 4.5999999999999996, 'txt'] 
>>> 
0

Si vous avez besoin des valeurs une par une, vous pouvez également créer un générateur pour les valeurs:

def my_funcvals(funcs,vals): 
    return ("%s(%r) = %r" %(f.__name__,d, f(d)) for d,f in zip(data, funcs)) 

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

for result in my_funcvals(funcs, data): 
    print result 
+0

Il est pas nécessaire d'écrire une fonction. Prenez simplement l'une des solutions de compréhension de liste et utilisez une expression de générateur. '(f (x) pour f, x dans zip (funcs, données))' –

+0

Je pensais qu'il est plus agréable d'écrire la fonction qui peut mettre en module utilitaire. J'ai supposé que probablement ce genre de génération arrive plus d'une fois. C'est donc une bonne pratique de ne pas aligner le générateur, car les générateurs ne peuvent pas être redémarrés, mais doivent être «régénérés». Ensuite, le module principal devient plus cohérent et le code est plus facile à réutiliser. J'ai aussi fait revenir les chaînes d'impression lisibles par l'homme. Cela pourrait être facilement transformé en objet. –

2

map()va travailler avec des séquences de fonctions, mais peut-être pas de la manière que vous pensiez:

data = ['1', '4.6', 'txt'] 
funcs = [int, float, str] 

result = map(lambda f,d: f(d), funcs, data) 
# or 
result = map(lambda d,f: f(d), data, funcs)