Что такое гибкий, гибридный объект коллекции Python? - PullRequest
0 голосов
/ 30 мая 2010

Как способ привыкнуть к python, я пытаюсь перевести часть своего кода на python из Autohotkey_L .
Я немедленно сталкиваюсь с тоннами выбора для коллекционных объектов.
Можете ли вы помочь мне выяснить встроенный тип или сторонний тип, который имеет максимально возможную функциональность AutoHotkey_L тип объекта и его методы .

AutoHotkey_L Объекты имеют свойства Python dict, list и экземпляра класса.

Я понимаю, что есть компромисс между пространством и скоростью, но я просто заинтересован в функциональности, а не в вопросах оптимизации.

Ответы [ 2 ]

10 голосов
/ 30 мая 2010

Не пишите Python как <another-language>. Напишите Python как Python.

Структура данных должна быть выбрана только для того, чтобы иметь минимальные возможности, которые вам нужны.

  • list - упорядоченная последовательность элементов с 1 гибким концом.
  • collections.deque - упорядоченная последовательность элементов с двумя гибкими концами (например, очередь).
  • set / frozenset - неупорядоченная последовательность уникальных элементов.
  • collections.Counter - неупорядоченная последовательность неуникальных элементов.
  • dict - неупорядоченное отношение ключ-значение.
  • collections.OrderedDict - заказное отношение ключ-значение.
  • bytes / bytearray - список байтов.
  • array.array - однородный список примитивных типов.

Глядя на интерфейс объекта,

  • dict будет наиболее подходящим для поиска значения по ключу
  • collections.OrderedDict будет наиболее подходящим для push / pop вещей.

когда вам нужно MinIndex / MaxIndex, где требуется отсортированное отношение ключ-значение (например, красное черное дерево). В стандартной библиотеке такого типа нет, но есть сторонние реализации .

1 голос
/ 30 мая 2010

Было бы невозможно рекомендовать определенный класс, не зная, как вы собираетесь его использовать.Если вы используете этот конкретный объект в качестве упорядоченной последовательности, в которой элементы могут повторяться, то вам следует использовать список;если вы ищете значения по их ключу, используйте словарь.Вы получите очень разные алгоритмические сложности во время выполнения с разными типами данных.Действительно, не нужно много времени, чтобы определить, когда использовать какой тип .... Я предлагаю вам еще немного подумать.

Если вы действительно не можете решить, есть возможность:

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

С учетом вышеизложенного вы можете использовать функции списка и словаря, например:

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}
...