Python: Получите значения (объекты) из словаря объектов, в которых одно из поля объекта соответствует значению (или условие)

У меня есть словарь 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, на всякий случай это релевантно

6
задан BorrajaX 26 October 2016 в 01:43
поделиться

5 ответов

Чтобы сделать dict из вашего dict,

subdict = dict((k, v) for k, v in myDict.iteritems() if v.field2 >= 2)
8
ответ дан 8 December 2019 в 13:45
поделиться
mySubList = [dict((k,v) for k,v in myDict.iteritems() if v.field2 >= 2)]

Документация:

список-понимание , iteritems ()

4
ответ дан 8 December 2019 в 13:45
поделиться

Идея заключается в создании "подсловаря" (список тоже подойдет)

Если вам нужен список, вы можете использовать filter (или itertools. ifilter):

result_list = filter(lambda x: x.field2 > 2, mydict.values())
2
ответ дан 8 December 2019 в 13:45
поделиться

"Наиболее эффективный" будет зависеть от того, как часто меняется содержимое словаря по сравнению с тем, как часто вы выполняете поиск.

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

Если словарь меняется не часто и вы делаете много поисков, то может быть быстрее создать один или несколько обратных словарей, например, один, отображающий значения "field2" на список объектов, имеющих это значение.

В качестве альтернативы, если вы собираетесь делать сложные запросы, вы можете поместить все данные в базу данных sqllite in-memory и позволить SQL разобраться с ними, возможно, с помощью ORM, такого как SqlAlchemy

.
0
ответ дан 8 December 2019 в 13:45
поделиться

Вы должны хранить свои различные записи, то есть экземпляры "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 и другие.

3
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: