2010-05-30 8 views
0

Pour m'habituer à python, j'essaye de traduire une partie de mon code en python à partir de Autohotkey_L.
Je suis immédiatement en train de faire des tonnes de choix pour les objets de collection.
Pouvez-vous m'aider à comprendre un type intégré ou un type contribué tiers qui a autant que possible, la fonctionnalité de l'AutoHotkey_L object type et son methods. AutoHotkey_L Les objets ont les caractéristiques d'une dict, d'une liste et d'une instance de classe python. Je comprends qu'il y a des compromis pour l'espace et la vitesse, mais je m'intéresse seulement à la fonctionnalité plutôt qu'aux problèmes d'optimisation.Qu'est-ce qu'un objet de collection python hybride flexible?

+0

Quelles sont les fonctionnalités de 'list'? – kennytm

+0

object._insert et object._remove push and pop à la fin de l'objet. les objets peuvent être des objets et sont mutables. – Naveen

Répondre

10

N'écrivez pas Python en tant que <another-language>. Ecrire Python comme Python.

La structure de données doit être choisie simplement pour avoir la capacité minimale que vous devez utiliser.

  • list - une séquence ordonnée d'éléments, avec une extrémité flexible.
  • collections.deque - un ordonné séquence d'éléments, avec 2 extrémités flexibles (par exemple une file d'attente).
  • set/frozenset - une séquence non ordonnée de uniques éléments.
  • collections.Counter - une non ordonnée séquence de éléments non uniques.
  • dict - une non ordonnée relation clé-valeur.
  • collections.OrderedDict - un commandé relation clé-valeur.
  • bytes/bytearray - une liste d'octets.
  • array.array - une liste homogène de types primitifs.

En regardant l'interface de l'objet,

  • dict serait le plus approprié pour trouver une valeur par clé
  • collections.OrderedDict serait le plus approprié pour la substance push/pop.

lorsque vous avez besoin minindex/maxindex, où relation triés valeur clé (par exemple arbre noir rouge) est nécessaire. Ce type n'existe pas dans la bibliothèque standard, mais il existe 3rd party implementations.

1

Il serait impossible de recommander une classe particulière sans savoir comment vous comptez l'utiliser. Si vous utilisez cet objet particulier en tant que séquence ordonnée où les éléments peuvent être répétés, vous devez utiliser une liste; Si vous recherchez des valeurs par leur clé, utilisez un dictionnaire. Vous obtiendrez une complexité d'exécution algorithmique très différente avec les différents types de données. Il ne faut pas vraiment beaucoup de temps pour déterminer quand utiliser quel type ... Je vous suggère de réfléchir davantage.

Si vous ne pouvez vraiment pas décider, cependant, voici une possibilité:

class AutoHotKeyObject(object): 
    def __init__(self): 
     self.list_value = [] 
     self.dict_value = {} 
    def getDict(self): 
     return self.dict_value 
    def getList(self): 
     return self.list_value 

Avec ce qui précède, vous pouvez utiliser la liste et les caractéristiques du dictionnaire, comme ceci:

obj = AutoHotKeyObject() 
obj.getList().append(1) 
obj.getList().append(2) 
obj.getList().append(3) 
print obj.getList() # Prints [1, 2, 3] 
obj.getDict()['a'] = 1 
obj.getDict()['b'] = 2 
print obj.getDict() # Prints {'a':1, 'b':2} 
+0

il y a quelques idées intéressantes ici aussi: http://stackoverflow.com/questions/1338714/accesing-dictionary-with-class-atribute. J'aimerais aussi pouvoir appliquer le traitement des listes à la «bande» dict/class qu'ils décrivent. – Naveen