按参数搜索和合并对象

时间:2010-12-19 12:22:39

标签: python search

我正在尝试创建一个方法,将多个参数化配置文件部分合并为一个。

每个部分都可以具有特定的部分参数,并包含配置变量的有效负载。有几个部分的例子:

[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. 对条件
  3. 中的其他参数重复步骤1
  4. 搜索符合两个条件参数的部分... 等等...
  5. 有一种快速而优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

这将按顺序合并它们,最后一个是最重要的:

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有效,但字典或元组列表也可以工作)。由于您关心匹配时参数的独特性,因此您需要将该部分的参数数量作为排序键的一部分。

然后您需要按顺序拍摄这些部分,然后合并它们。真的没有解决方法。 :)

然而,可能有快速而优雅的方法来解决您的用例,但我们不知道您没有告诉我们您为什么这样做。也可能值得问一个问题。