2012-06-20 4 views
1

J'ai joué avec Python et j'ai cette liste dont j'ai besoin. Fondamentalement, je tape une liste de jeux dans le tableau multidimensionnel, puis pour chacun, il fera 3 variables basées sur cette première entrée.Python Liste comme nom de variable

tableau qui est fait:

Applist = [ 
['Apple', 'red', 'circle'], 
['Banana', 'yellow', 'abnormal'], 
['Pear', 'green', 'abnormal'] 
] 

Pour boucle d'attribuer à chaque fruit un nom, la couleur et la forme.

for i in Applist: 
    i[0] + "_n" = i[0] 
    i[0] + "_c" = i[1] 
    i[0] + "_s" = i[2] 

En faisant cela cependant, je reçois un message opérateur ne peut pas affecter. Comment puis-je combattre cela?

Le résultat attendu serait:

Apple_n == "Apple" 
Apple_c == "red" 
Apple_s == "circle" 

Etc pour chaque fruit.

+2

souhaitez-vous imprimer? – Froyo

Répondre

16

Ceci est une mauvaise idée. Vous ne devez pas créer dynamiquement des noms de variables, utilisez un dictionnaire à la place:

variables = {} 
for name, colour, shape in Applist: 
    variables[name + "_n"] = name 
    variables[name + "_c"] = colour 
    variables[name + "_s"] = shape 

maintenant y accéder comme variables["Apple_n"], etc.

Qu'est-ce que vous voulez vraiment bien, est peut-être un dict de dicts:

variables = {} 
for name, colour, shape in Applist: 
    variables[name] = {"name": name, "colour": colour, "shape": shape} 

print "Apple shape: " + variables["Apple"]["shape"] 

Ou, peut-être encore mieux, un namedtuple:

from collections import namedtuple 

variables = {} 
Fruit = namedtuple("Fruit", ["name", "colour", "shape"]) 
for args in Applist: 
    fruit = Fruit(*args) 
    variables[fruit.name] = fruit 

print "Apple shape: " + variables["Apple"].shape 

Vous ne pouvez pas modifier les variables de chaque Fruit si vous utilisez un namedtuple (par ex. pas de réglage variables["Apple"].colour à "green"), donc ce n'est peut-être pas une bonne solution, en fonction de l'utilisation prévue. Si vous aimez la solution namedtuple mais que vous voulez changer les variables, vous pouvez en faire une classe complète Fruit à la place, qui peut être utilisée comme remplacement de namedtupleFruit dans le code ci-dessus.

class Fruit(object): 
    def __init__(self, name, colour, shape): 
     self.name = name 
     self.colour = colour 
     self.shape = shape 
+0

Bonne réponse .... – mVChr

+0

Merci @lazyr, C'était une solution très rapide :) J'ai juste une question de plus ... si maintenant vous aviez pour nom, couleur, forme dans Applist: variables [nom] = forme. Cela changerait-il le nom dans Applist, ou cela créerait-il une nouvelle variable et ne toucherait pas l'Applist? – Skowt

+0

@Skowt 'Applist' et' variables' sont complètement indépendants après l'exécution de ce code, et tout ce qui est fait pour l'un d'eux n'affecte pas l'autre. –

2

Il serait plus facile de le faire avec un dictionnaire:

app_list = [ 
    ['Apple', 'red', 'circle'], 
    ['Banana', 'yellow', 'abnormal'], 
    ['Pear', 'green', 'abnormal'] 
] 
app_keys = {} 

for sub_list in app_list: 
    app_keys["%s_n" % sub_list[0]] = sub_list[0] 
    app_keys["%s_c" % sub_list[0]] = sub_list[1] 
    app_keys["%s_s" % sub_list[0]] = sub_list[2] 
Questions connexes