2010-01-08 7 views
2

J'espère que quelqu'un peut vous aider. J'utilise Python et j'aimerais pouvoir faire ce qui suit.Structures de données Python, dictionnaire?

J'ai un ensemble d'objets (formes par exemple) et une série de commandes pour agir sur ces objets. Les commandes ont le format d'une chaîne de commande suivi d'un nombre variable de paramètres qui peuvent être des chaînes ou des entiers

Par exemple, la forme « rectangle » peut avoir les commandes suivantes
« changeColor » « vert »
' FillStyle » 'trappe'
'Dimensions' 10 15
etc .....

Quelle serait la meilleure structure de données pour stocker ces informations. Je dois être capable de récupérer facilement ces commandes à partir de la structure de données en fonction de la 'forme' de l'objet. Est-ce qu'un dictionnaire être le bon choix, je ne l'ai jamais utilisé ces avant

Merci

Répondre

0

Il me semble qu'une commande pourrait être représentée comme une liste [] ou tuple (), et ne pouvait donc une série de commandes. Donc, une possibilité est que vous avez une liste de listes de chaînes. Généralement, vous souhaitez utiliser un dictionnaire uniquement lorsque vous souhaitez rechercher une valeur par clé. Par exemple, si vous connaissiez le nom d'une commande (par une forme) et que vous vouliez savoir quels paramètres étaient transmis à cette commande, vous pourriez avoir un mappage de dictionnaire de chaîne à liste.

Si vous postez plus sur comment vous prévoyez d'utiliser ces données, je pourrais donner une meilleure réponse.

Voici un lien vers la documentation de Python sur les structures de données de base, ce qui devrait être très utile: http://docs.python.org/tutorial/datastructures.html

Modifier: en réponse au premier commentaire, vous devez stocker les commandes ou tout simplement les lire entrer un par un et les exécuter?

+0

Hi danben. Merci. J'ai oublié de mentionner que les commandes sont exécutées dans un ordre séquentiel. Donc donné une forme je voudrais récupérer le premier comammnd et exécuter. Une fois terminé, je voudrais traiter la deuxième commande et ainsi de suite – tosspot

+0

Salut, j'ai besoin de les stocker. merci – tosspot

2

dicts sont pour quand la commande n'est pas importante mais que vous voulez stocker des valeurs pour différents noms.

lists sont des séquences ordonnées d'objets, habituellement du même type et la position ne signifie rien de particulier.

tuples sont des séquences ordonnées d'objets, éventuellement de types différents et chaque position différente a une signification spécifique.

3

Vous pourriez être mieux de créer votre propre classe:

class Shape(object): 
    def __init__(self): 
     self.shape = "rectangle" 
     self.color = "green" 
     self.fillstyle = "hatch" 
     # etc 

    def ChangeColor(self, color): 
     self.color = color 

    # etc 
+0

Ce sont des propriétés, mais il veut représenter des commandes. Je ne pense pas que ce soit aussi utile. – danben

+0

@danben: il suffit d'ajouter une méthode dans la définition de l'objet: def ChangeColor (self, color): self.color = color.lower() @recursive: il y a une faute de frappe, vous devez remplacer 'this' par 'self' – dalloliogm

+0

Merci dallo. J'ai ajouté une méthode pour illustrer comment les commandes fonctionneraient et corriger la faute de frappe "this". Merde C# dans mon cerveau. – recursive

1

Je suggère d'utiliser une classe d'objets et de stocker toutes les valeurs/commandes dans cet objet afin que vous puissiez le transmettre facilement. (Semblable à ce que dit recursive).

Cependant; vous pouvez également utiliser un dictionnaire avec la clé étant le nom de l'objet et les valeurs étant une liste contenant des commandes possibles.

0

Que pensez-vous de cela?

Exemple

s = {'Rectangle': 
     {'ChangeColor':'green','FillStyle':'hatch', 
     'Dimension1': 10, 'Dimension2':15}} 
s['Triangle'] = {'ChangeColor':'red','FillStyle':'hatch', 
     'Dimension1': 10, 'Dimension2':15, 'Dimension3':5} 

for k, v in s.iteritems(): 
    print k 
    for k1, v1 in v.iteritems(): 
     print " ", k1, "=", v1 

Résultat:

Triangle 
    Dimension1 = 10 
    Dimension2 = 15 
    Dimension3 = 5 
    ChangeColor = red 
    FillStyle = hatch 
Rectangle 
    Dimension1 = 10 
    Dimension2 = 15 
    ChangeColor = green 
    FillStyle = hatch 
+0

Oui merci, comment pourrais-je gérer la commande sans paramètre, c'est-à-dire une clé sans valeur. Merci – tosspot

+0

s ['nodefinedShape'] = {} – Tristan

+0

Après impression k, écrire: sinon v: imprimer "vide" continuer – Tristan

0

Je stockerait les commandes comme une liste de listes ou de tuples, selon si oui ou non je pensais que je modifier les commandes. Notez que le déballage des arguments dans Python est un mécanisme très simple pour exécuter ces commandes, par exemple:

class Shape(object): 
    def background(self, color): 
     print "background:", color 
    def foreground(self, color): 
     print "foreground:", color 
    def rect(self, left, top, right, bottom): 
     print "rect:", left, top, right, bottom 
    def execute_commands(self, command_list): 
     for command in command_list: 
      if hasattr(self, command[0]): 
       getattr(self, command[0])(*command[1:]) 

>>> s = Shape() 
>>> c = [('background', 'blue'), ('foreground', 'yellow'), ('rect', 10, 0, 20, 20)] 
>>> s.execute_commands(c) 
background: blue 
foreground: yellow 
rect: 10 0 20 20