У меня есть словарь Python, ключи которого являются строками, и значения являются объектами.
Например, объект с одной строкой и одним интервалом
class DictItem:
def __init__(self, field1, field2):
self.field1 = str(field1)
self.field2 = int(field2)
и словарь:
myDict = dict()
myDict["sampleKey1"] = DictItem("test1", 1)
myDict["sampleKey2"] = DictItem("test2", 2)
myDict["sampleKey3"] = DictItem("test3", 3)
Который является лучше всего/больше всего эффективным способом получить словарные статьи, которые имеют "field2" поле> = 2?
Идея создает "подсловарь" (список сделал бы также) только с записями в который field2> = 2 (в примере, будет похож):
{
"sampleKey2": {
"field1" : "test2",
"field2": 2
},
"sampleKey3": {
"field1" : "test3",
"field2": 3
}
}
Существует ли лучший путь, чем обход через все элементы словаря и проверка на условие? Возможно, с помощью itemgetters, и функции лямбды?
Спасибо!
P.S.: Я использую Python2.4, на всякий случай это релевантно
Чтобы сделать dict
из вашего dict
,
subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)
mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)]
Документация:
Идея заключается в создании "подсловаря" (список тоже подойдет)
Если вам нужен список, вы можете использовать filter (или itertools. ifilter):
result_list = filter(lambda x: x.field2 > 2, mydict.values())
"Наиболее эффективный" будет зависеть от того, как часто меняется содержимое словаря по сравнению с тем, как часто вы выполняете поиск.
Если словарь меняется часто, а поиск выполняется реже, то наиболее эффективным методом будет перебор итеритемов и выбор объектов, соответствующих критериям, используя код, который опубликовал Адам Бернье.
Если словарь меняется не часто и вы делаете много поисков, то может быть быстрее создать один или несколько обратных словарей, например, один, отображающий значения "field2" на список объектов, имеющих это значение.
В качестве альтернативы, если вы собираетесь делать сложные запросы, вы можете поместить все данные в базу данных sqllite in-memory и позволить SQL разобраться с ними, возможно, с помощью ORM, такого как SqlAlchemy
.Вы должны хранить свои различные записи, то есть экземпляры "DicItem", внутри списка. Выражение генератора / списка может затем отфильтровать ваши желаемые результаты с легкостью.
data = [
DictItem("test1", 1),
DictItem("test2", 2),
DictItem("test3", 3),
DictItem("test4", 4),
]
, а затем:
results = [item for item in data if item.field2 >= 2]
Это, конечно же, создает линейный фильтр. Если вам нужна более чем линейная скорость для некоторых из ваших запросов, объект-контейнер для регистров - в этом случае «список» должен быть специализированным классом, способным создавать индексы данных в нем, как это делает СУБД со своей таблицей. индексы. Это можно легко сделать, создав класс из «list» и переопределив методы « append», «insert», «__getitem__», «__delitem __»
и «pop»
.
Если вам это нужно для высококлассного приложения, я предлагаю вам взглянуть на некоторые из существующих объектно-ориентированных систем БД для Python, такие как ZODB и другие.