views:

109

answers:

2

As a way to get used to python, I am trying to translate some of my code to python from Autohotkey_L.
I am immediately running into tons of choices for collection objects.
Can you help me figure out a built in type or a 3rd party contributed type that has as much as possible, the functionality of the AutoHotkey_L object type and its methods.

AutoHotkey_L Objects have features of a python dict, list, and a class instance.

I understand that there are tradeoffs for space and speed, but I am just interested in functionality rather than optimization issues.

+1  A: 

It would be impossible to recommend a particular class without knowing how you intend on using it. If you are using this particular object as an ordered sequence where elements can be repeated, then you should use a list; if you are looking up values by their key, then use a dictionary. You will get very different algorithmic runtime complexity with the different data types. It really does not take that much time to determine when to use which type.... I suggest you give it some further consideration.

If you really can't decide, though, here is a possibility:

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

With the above, you could use both the list and dictionary features, like so:

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}
Michael Aaron Safyan
there are some interesting ideas here as well: http://stackoverflow.com/questions/1338714/accesing-dictionary-with-class-atribute. I'd also like to be able to apply list processing to the dict / class "bunch" they describe.
Naveen
+8  A: 

Don't write Python as <another-language>. Write Python as Python.

The data structure should be chosen just to have the minimal ability you need to use.

  • list — an ordered sequence of elements, with 1 flexible end.
  • collections.deque — an ordered sequence of elements, with 2 flexible ends (e.g. a queue).
  • set / frozenset — an unordered sequence of unique elements.
  • collections.Counter — an unordered sequence of non-unique elements.
  • dict — an unordered key-value relationship.
  • collections.OrderedDict — an ordered key-value relationship.
  • bytes / bytearray — a list of bytes.
  • array.array — a homogeneous list of primitive types.

Looking at the interface of Object,

  • dict would be the most suitable for finding a value by key
  • collections.OrderedDict would be the most suitable for the push/pop stuff.

when you need MinIndex / MaxIndex, where a sorted key-value relationship (e.g. red black tree) is required. There's no such type in the standard library, but there are 3rd party implementations.

KennyTM