Поиск и объединение объектов по его параметрам - PullRequest
0 голосов
/ 19 декабря 2010

Я пытаюсь создать метод для объединения нескольких разделов параметризованного файла конфигурации в один.

Каждый раздел может иметь определенные параметры раздела и содержать полезную нагрузку переменных конфигурации. Есть примеры нескольких разделов:

[MySection]
    foo = defaultbar

[MySection|color=red|shape=circle]
    foo = bar
    variable = value

[MySection|shape=circle]
    otherfoo = otherbar
    foo = anotherbar

Эти секции представлены следующим классом:

class Section():
    # All values here are parsed from config file
    name = "MySection"

    # This is a section specific parameters
    params = {'color': 'red',
              'share': 'circle',
              'weight': 'ton'}

    # This is section variables payload
    vars = {'foo': 'bar',
            'variable': 'value'}

    def merge(self, section):
        """Merges current section vars with vars of given one"""
        # ...code here...

(все параметры и переменные назначаются во время выполнения, а не статически) Параметры секции могут отличаться, некоторые могут отсутствовать.

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

Например, у меня есть список разделов:

sections[0].params = {'color': 'blue'}

sections[1].params = {'shape': 'circle'}

sections[2].params = {'color': 'red'}

sections[3].params = {'shape': 'circle'}

sections[4].params = {'color': 'blue',
                      'shape': 'circle'}

sections[5].params = {'weight': 'ton'}

sections[6].params = {'color': 'blue'}

sections[7].params = {'color': 'blue',
                      'shape': 'circle',
                      'weight': 'ton'}

Критериями выбора и объединения (определенными во время выполнения) является OrderedDict, например:

criteria = {'color': 'blue',
            'shape': 'circle',
            'weight': 'ton'}

Теперь мне нужно поискать в списке разделов, чтобы найти те, которые хотя бы частично соответствуют этому критерию. Разделы, которые имеют больше совпадений параметров, должны быть объединены позже.

С заданными критериями разделы будут объединены в следующем порядке:

sections[0] + sections[6] + sections[1] + sections[3] + sections[5] +
sections[4] + sections[7]

Порядок слияния важен, возможно, за исключением тех же разделов параметров (например, 0 и 6, 1 и 3) Общий алгоритм:

  1. Поиск раздела, имеющего только первый параметр критериев, и объединение их
  2. Повторите шаг 1 для других параметров в критериях
  3. Поиск раздела, который соответствует двум параметрам критериев ... и так далее ...

Есть ли быстрый и элегантный способ сделать это?

1 Ответ

0 голосов
/ 19 декабря 2010

Это объединит их по порядку, причем последний из них будет самым важным:

parameters = {}
parameters.update(sections[0])
parameters.update(sections[6])
parameters.update(sections[1])
parameters.update(sections[3])
parameters.update(sections[5])
parameters.update(sections[4])
parameters.update(sections[7])

Мне неясно, что вы имеете в виду под «критериями слияния».Возможно, вы имеете в виду, что некоторые значения важнее других, но тогда нет хорошего способа сделать это, кроме как посмотреть на каждый параметр.

Обновление:

Нет, быстрых иэлегантный способ сделать то, что вы хотите.

Сначала вам нужно отсортировать разделы по тому, насколько они соответствуют вашим критериям слияния, который должен быть списком ключей и значений (OrderedDict работает, но список словарей иликортежи тоже работают).Поскольку вы заботитесь о том, насколько уникальны параметры при сопоставлении, вам необходимо указать количество параметров для раздела как часть ключа сортировки.

Затем необходимо взять разделы в указанном порядке и объединить их.,Там нет обходного пути, на самом деле.:)

Однако могут быть быстрые и элегантные способы решения вашего варианта использования, но мы не знаем, что вы не скажете нам, почему вы это делаете.Возможно, стоит задать вопрос об этом тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...