我应该使用哪种Python数据结构?

时间:2016-02-07 19:33:16

标签: python xml data-structures

有人可以推荐下面描述的FinalResults的最佳数据结构:

我从XML文档中提取各种信息。粗略地说,这就是我的工作:首先使用find_all找到包含关键字的text元素。然后对每个结果:

  1. 获取text元素
  2. 的父标记
  3. 获取该父级的属性,
  4. 使用正则表达式搜索text元素的内容以获取其他文本。
  5. 最后一次搜索会产生最多6个匹配组的结果。

    这整个操作最终可能会返回这样的内容:

    FinalResult 1: [parent, parent-attr, match.group(1), match.group(2) ... ,match.group(6)]
    
    FinalResult 2: [parent, parent-attr, match.group(1), match.group(2) ... ,match.group(6)]
    

    我可能获得的FinalResults没有最大数量。但平均而言,我希望每个XML文档少于10个。我计划将每个FinalResult用于其他处理,但不会在FinalResults中更改或添加任何内容。例如,我可能会说:使用属性XYZ返回<parent>并获取其他数据,然后从其他地方获取名称为match.group(2)的文件。

    我可能只会访问每个FinalResult几次。如果重要的话,一些match.groups可以是&#34; None&#34;

    这是一个例子。假设这是FinalResult [0]:['paragraph', '39871234', '42', '103', 'b', '1', None, None]

    段落将是包含我找到的关键字的标记的父标记。 39871234将是段落标记的id属性 42表示卷号 103是该卷中的一部分 b和1是该部分的细分

    我会使用42/103 / b / 1从另一个xml文件中提取信息。 段落和id将用于我需要告诉一个关键字搜索结果来自另一个,因为该文件将有多个文本元素。 (例如Paragraph id=39871234 text [string containing keyword]

    我的问题是我应该将所有FinalResults存储为字典,列表,元组还是别的什么?

1 个答案:

答案 0 :(得分:1)

真实的数据结构建议问题会对数据结构应该做什么或帮助您实现什么有一些实际要求。如果您的问题中没有任何此类信息,我想您正在寻找的简单直接的答案是:

在任何现代的面向对象语言中,表示相关属性集合的标准方法是使用getter和setter方法创建一个简单的类(除非对象在创建后是不可变的,其中唯一的方法是设置一个属性就是当你第一次实例化它的包含对象时。)

您的示例建议使用attribute()parent_attribute()matches()方法的类,其中前两个显然会返回简单字符串,最后一个是字符串列表。您的主程序可能有一个或多个这些对象的列表,或者可能是一个字典,键入您要用于访问以前对象的功能(标识属性?)

class Match (object):
    def __init__ (self, attrib, parent_attr, matches):
        self.attrib, self.parent_attr, self.matches = attrib, parent_attr, matches

    def attribute (self):
        return self.attrib

    def parent_attribute (self):
        return self.parent_attr

    def matches (self):
        return self.matches

对列表的好处应该是显而易见的:代替match[0]代码显示match.attribute(),它会立即传达正在发生的事情。

对dict的好处不太明显,但在实践中经常需要为它做好准备:当你想重构代码时,更改类实现比更改代码的每个地方都要简单得多使用其中一个实例。

因此,例如,如果由于一些奇怪的原因你意识到你想要在使用该类一段时间之后使用一个列表,你只需要更改初始化代码和getter,而不是每一段操纵这些实例的代码;并且幕后列表实现的细节对于使用该类的任何代码都是完全透明的。

模块化设计还有许多其他好处;如果你想了解更多细节,请找一个好的OOP介绍。

如果这种设计的性能不令人满意,那么可能需要一个具有一些实际要求(速度,记忆等)的新问题。