2013-04-08 4 views
-1

Ma question concerne le style de codage: Quand je veux appliquer une procédure à plusieurs variables, comme:plusieurs lignes similaires en python

from pylab import vstack  # the function to apply to many variables 
v1 = range(5)  # some dummy variables 
v2 = range(9) 
... 
v20 = range(8) 

# now, I want to apply a function to all variables that changes them! 
v1 = vstack(v1) # I really do not need the "old" v1 anymore 
v2 = vstack(v2) 
... 
v20 = vstack(v20) 

Ce sont 20 lignes de presque le même code. Existe-t-il un moyen d'écrire les conversions (vx = vstack(vx)) en moins de lignes?

Les mettre dans un itérables ne fonctionne pas:

all_v = [v1, v2, v3, .... , v20] 
for v in all_v: 
    v = vstack(v) 

type (v1) # -> v1: <type: list> 

Répondre

0

Avez-vous vraiment besoin d'être en variables distinctes pour commencer? C'est généralement une odeur de code. Je les garde dans une liste ou un dict si les noms sont importants, et mise à jour:

my_data = {} 
my_data['v1'] = range(5) 
my_data['v2'] = range(9) 
...etc... 

my_data = {k: vstack(v) for k, v in my_data.iteritems()} 
+0

Votre proposition à « regrouper » les variables travaux bien sûr, et je pense que je vais le faire. Cependant, j'aimerais savoir (curiosité) s'il y a une solution à mon problème? – Moritz

+0

Vous pouvez le faire en mettant à jour le dictionnaire 'locals()'. Cependant, ce n'est vraiment pas recommandé. 'locals(). update ({k: v pour k, v dans les locals(). items() si k dans ['v1', 'v2' ...]})' –

+0

C'est tout - Merci! – Moritz

0
from pylab import vstack 
parameters = (5, 9, ..., 8) 

v = [vstack(range(p)) for p in parameters] 

Cela exécutera une compréhension de la liste de tuple parameters, qui contient vos paramètres à la range fonction. Pour chaque paramètre de ce tuple, le résultat de la fonction range est transmis à la fonction vstack. Les résultats sont rassemblés dans une liste.

Ainsi v[0] correspond au résultat de la valeur du paramètre parameters[0] etc.

Dans votre code, il ne fonctionne pas parce que vous écrasez localement la variable v dans la boucle. Cela ne changera pas l'élément dans la liste d'origine. Si vous voulez créer un (nouveau) liste de ces résultats, vous pouvez utiliser list.append:

all_v = [v1, v2, v3, .... , v20] 
new_v = [] 
for v in all_v: 
    new_v.append(vstack(v)) 
+0

Merci! Cependant, pour la partie pratique, je pense que la solution de Daniel est bonne. Pourtant, je suis intéressé (pure curiosité) de savoir s'il y a une solution à mon problème original. – Moritz

+0

@ user2055010 N'est-ce pas répondu dans le dernier paragraphe & extrait de code? Ceci est votre solution originale, juste de travailler. – poke

+0

Ensuite, je n'ai pas les nouvelles valeurs sur les anciens noms de variables. (Daniel a proposé de mettre à jour le dictionnaire 'locals()' - c'était ce que je cherchais.) – Moritz

Questions connexes