Теперь, как мне сделать поиск, если 'column1'
имеет значение11
any(arow['column1'] == 'value11' for arow in table.iteritems())
Это метод формирования таблиц
неправильно?
Нет, это просто очень "разоблачено", возможно, слишком много - его полезно инкапсулировать в класс, который предоставляет нужные вам методы, тогда вопрос о том, как лучше всего реализовать их, не влияет на все остальное ваше приложение. .
Есть ли лучший способ реализации
такие таблицы с более легкими поисками?
После того, как вы разработали класс, интерфейс которого вы бы хотели бы использовать , вы можете поэкспериментировать с очень разными подходами к реализации и сравнить их с рабочей нагрузкой, которая представляет ваш шаблон использования Таким образом, вы можете узнать, что лучше для вас (конечно, при условии, что манипулирование таблицами и поиск являются большой частью времени выполнения вашего приложения - profile your application).
У меня были похожие, но не идентичные потребности в большом внутреннем приложении, которое я поддерживаю на работе, за исключением того, что индексы строк целочисленные (только имена столбцов являются строками), порядок столбцов важен, а рабочая нагрузка больше связана с «редактированием» «таблица (добавление, удаление, изменение порядка строк или столбцов, переименование столбцов и т. д.). Я начал с таблицы, демонстрирующей необходимые мне функциональные возможности, с самой простой и грубой внутренней реализацией (список диктов, плюс список имен столбцов для упорядочения столбцов); и к настоящему времени я развил это (независимо от фактических частей «уровня приложения», но основываясь на их профилировании и сравнительном тестировании) до совершенно разных реализаций (в настоящее время основанных на numpy
).
Я думаю, что вы должны действовать в том же духе: «одеть» свою текущую реализацию в красивый «интерфейс» со всеми необходимыми методами, профилировать свое приложение - если только этот объект таблицы не является узким местом в производительности, все готово; если является узким местом, вы можете оптимизировать реализацию (экспериментировать, измерять, повторять ;-), не нарушая работу остальной части вашего приложения.
Наследование от dict
не очень хорошая идея, потому что вы, вероятно, не хотите раскрывать всю богатую функциональность dict
; плюс, что вы делаете, грубо говоря, неэффективная реализация collections.defaultdict(dict)
. Итак, инкапсулирует последний:
import collections
class Table(object):
def __init__(self):
self.d = collections.defaultdict(dict)
def add(self, row, col, val):
self.d[row][col] = val
def get(self, row, col, default=None):
return self.d[row].get(col, default)
def inrow(self, row, col):
return col in self.d[row]
def incol(self, col, val):
return any(x[col]==val for x in self.d.iteritems())
и т. Д. - напишите все методы, которые нужны вашему приложению, с полезными короткими именами, а затем, возможно, посмотрите, можете ли вы назвать некоторые из них псевдонимами как специальные методы, если они часто используются таким образом, например, возможно (предполагается, что Python 2 . * - требуется немного другой синтаксис в 3. *):
def __setitem__(self, (row, col), val):
self.add(row, col, val)
и так далее. Как только код заработает, , тогда наступит подходящее время для профилирования, тестирования и, возможно, внутренней оптимизации реализации.