【问题标题】:Which Python data structure should I use?我应该使用哪种 Python 数据结构?
【发布时间】:2016-02-07 19:33:16
【问题描述】:

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

我正在从 XML 文档中提取各种信息。大致来说,这就是我所做的:首先使用 find_all 定位包含关键字的text 元素。然后对于每个结果:

  1. 获取text元素的父标签
  2. 获取该父级的属性,然后
  3. 使用正则表达式搜索text 元素的内容以获取其他文本。

最后一次搜索产生的结果最多包含 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 中更改或添加任何内容。比如我可能会说:回到<parent>属性为XYZ并获取其他数据,然后从其他地方获取一个名为match.group(2)的文件。

我可能只会访问每个 FinalResult 几次。如果重要的话,一些 match.groups 可能是“无”

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

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

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

我的问题是我应该将所有 FinalResults 存储为字典、列表、元组还是其他形式?

【问题讨论】:

  • XML 自然是一棵树。而python有ElementTree class
  • 请进一步说明您要存储在数据结构中的信息的语义。
  • 板球,你的第一条评论没有解决这个问题。关于你的第二个,我没有在 XML 上使用正则表达式。我在从节点提取的文本上使用它。无论如何,您的两个 cmet 都不是投反对票的正当理由。
  • Genti,我是否正确,您要求提供我将存储的信息样本?如果是这样,我已经在问题中添加了一个。

标签: python xml data-structures


【解决方案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 的良好介绍。

如果此设计的性能不能令人满意,可能需要一个具有一些实际要求(速度、内存等)的新问题。

【讨论】:

  • 我是新手。您在考虑什么样的实际需求?我不知道什么样的速度和内存适合我的任务。我假设“快”和“尽可能少”。但我知道这不是一个很好的答案
  • 这就像“我应该为六口之家买什么车”。如果您可以说低油耗、混合动力发动机、轮椅可及性、四轮驱动、速度或许多其他因素中的一个或多个比其他因素更重要,那将减少可行选项的数量,但没有任何这样的限制,几乎是“任何你喜欢的”,包括小巴模型。至少“家庭”要求不包括长途卡车和摩托车。
  • 无论如何,这里的关键真的是“如果这足够好,不要让事情复杂化”。如果您发现您的程序太慢或使用太多内存而不实用,或者如果您的代码因数据模型不符合您的需求而变得复杂,那么实际需求就会浮出水面。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多