基于Python爬虫的特定商品信息评价分析系统的设计与实现外文翻译资料

 2022-09-08 12:09

英语原文共 494 页,剩余内容已隐藏,支付完成后下载完整资料


5推导数据

这个教练是你的老朋友,你很愿意帮忙。她最好的一组U10选手一直在刻苦训练。每跑一个600米,Kelly就会计时并把时间记录在计算机上的一个文本文件中。总共有4个文件,分别记录James,Sarah,Julie和Mikey的时间数据首先

首先,这个教练需要一种快捷的方式能够很快了解每个选手跑得最快的3个时间。

你能帮忙吗?

问:那行data.sprip().split(lsquo;,rsquo;)代码看起来有些奇怪,你能解释下这是怎么回事吗?

答:这叫做方法串链(method chaining).第一个方法strip()应用到data中的数据行,这回去除字符串所有不想要的空白符。之后,去除了空白符的结果由第二个方法split(lsquo;,rsquo;)处理,这会创建一个列表。所得到的列表再应用到以上代码中的目标识别符。采用这种方式,可以把多个方法串链在一起,生成所需的结果,最好从左到右读这种方法链。

到目前为止,一切都很顺利,现在Kelly教练的数据在Python内存中表示为4个列表。出了使用方法串链外,这里并没有其他的新内容,因为对于知何从文件读取数据以及如何使用这些数据填充列表,你已经相当了解了。还没有得到向教练显示的内容,所以先别打扰他,下面将升序排列他的数据,这要求对数据进行排序。

下面来看Python中有哪些排序选择

排序有两种方式

使用Python对数据排序时,你有两种选择。

原地排序(In-place sorting)是指按你指定的顺序排列数据,然后用排序后的数据替换原来的数据。原来的顺序会丢失,对于列表,sort()方法会提供原地排序。

复制排序(Copied sorting)是指按你指定的顺序排列数据,然后返回原数据的一个有序副本。原数据的顺序依然保留,只是对一个副本排序。在Python中,sprted()BI支持复制排序。

问:使用sort()时原来无序的数据怎么样了?

答:总的来说,原来的数据会消失。Pythoon会取一个副本,对他排序,然后用这个有序的版本替换原来的数据。

问:这么说,没有办法得到原来的数据了?

答:并非如此,如果原数据的顺序对你来说很重要,可以使用sorted()BIF将数据转换为一个有序的副本。

太对了。分钟和秒的分隔符把Python的顺序技术弄糊涂了。

在各个选手的文件中分别记录他们的时间时,Kelly教练使用了不同的字符来分隔分钟和秒,看起来你需要修正这些数据。

时间的麻烦

嗯hellip;hellip;hellip;还远远不够,是不是?

仔细查看教练的数据,看看问题出在哪里。以下再次给出Sarah的原始数据:

应该记得,从文件读入的数据会作为文本传入程序,所以一旦Sarah的数据转换为一个“时间”列表,数据形式如下:

对Sarah的数据排序时,最后会得到这个顺序(这并不是你真正想要的):

Python可以对字符串排序,对字符串排序时,短横线排在点号前面,点号则在冒号前面。所有这些字符都以2开头,各个字符串中的下一个字符就相当于一个分组机制,有短横线的世时间分组并排序,然后是包含点号的时间,最后是包含冒号的时间。

教练数据中存在的这种不一致性导致排序失败。

代码磁贴

下面创建一个函数,名为sanitize(0,这个函数从各个选手的列表接收一个字符串作为输入,然后处理这个字符串,将找到的所有短横线或冒号替换为一个句号,并返回清理过的字符串。注意:如果字符串已经包含一个点号,则不需要再做清理。

重新组织这一页下面的代码磁贴,提供所需的功能。

代码磁贴答案

下面创建一个函数,名为sanitize(0,这个函数从各个选手的列表接收一个字符串作为输入,然后处理这个字符串,将找到的所有短横线或冒号替换为一个句号,并返回清理过的字符串。注意:如果字符串已经包含一个点号,则不需要再做清理。

重新组织这一页下面的代码磁贴,提供所需的功能。

当然,只有sanitize()函数还不够。你还需要迭代处理每一个数据列表,使用这个新函数将各个选手的时间分别转换为正确的格式。

下面将具体使用这个新函数进行处理。

这个输出看起来好多了,

虽然得到这个结果费了一番功夫,不过现在4个文件中得到的数据不仅有序,而且格式是一致的。通过在排序对数据进行预处理,可以有效地确保Python的排序技术正常工作。

没错。重复的代码确实是个问题。

可以看到,你的代码创建了4个列表来保存从数据文件读取的数据。然后代码再创建另外4个列表保存清理的数据。另外,当然到处都在迭代hellip;hellip;.

应该还有更好的方法来写这样的代码。

转换列表是一个很常见的需求,因此Python提供了一个工具,可以尽可能毫不费力的完成这种转换。这个工具有一个相当费解的名字,叫做列表推导(List comprehension)。设计列表推导是为了减少一个列表转换为另一个时所需编写的代码亮。

推导列表

想想看讲一个列表转换为另一个列表时需要做什么。必须做4件事,你需要:

  1. 创建一个新列表来存放转换后的数据。
  2. 迭代处理原列表中的各个数据项。
  3. 每次迭代时完成转换。
  4. 将转换后的数据追加到新列表。

有意思的是,在这里住转换已经缩减为只有一行代码。另外,不再需要指定使用append()方法。因为这个动作已经隐含在列表的推导中。很棒吧?

问:那么hellip;hellip;能不能这样考虑:列表推导好,列表迭代不好,是这样吗?

答:不,并不能这样看,如果必须时一个列表中的每一项完成一个转换,使用列表推导是上策,特别是如果能很容易的在一行上指定转换(或者指定为一个函数),列表推导尤其适用。列表迭代可以完成列表推导所能完成的全部工作,只是列表迭代需要的代码更多一些,不过如果需要,迭代确实能提供更大的灵活性。

列表推导的妙处

通过对这个教练的选手数据使用列表推导,可以大幅度减少需要你维护的代码。另外,随着你对列表推导的语法和用法越来越熟悉,你会发现列表推导的使用很自然,与你的大脑考虑数据方式以及你希望应用的转换时一致的。

下面来确认这个新代码能够如你所愿,正常工作。

正如我们期望的,输出与前面完全一致。

你已经编写了一个程序,可以从Kelly教练的数据文件读入数据,将原始数据存储在列表中,将数据清理为一种一致的格式,然后排序并在屏幕上显示教练的数据,所有这些才不过25行代码。现在可以让教练看看你的输出了。

教练会认为怎样呢?

由于你匆匆清理数据并进行排序,以至于忘了考虑你实际要做什么:你的任务是声场每个选手的3次最快时间。而且,当然你的输出中不该有任何重复的时间。

访问列表中的前3个数据项很容易。可以使用标准记法指定单个的列表项,或者或者用一个列表分片:

不过hellip;hellip;.你怎么从列表中去除重复的数据项呢?

迭代删除重复项

要处理列表来去除重复项,但在这方面列表推导也帮你了你,因为重复项的删除不是一个转换,这更应算是一个过滤器。重复项删除过滤器需要在列表创建过程中检查所创建的列表,这对于列表推导来说是无法做到的。

为了满足这个新需求,你需要求助于常规的列表迭代代码。

成功了!

现在你只显示每个选手的最前面3个时间,而且成功地删除了重复项。在这种情况下,列表迭代代码正是你需要的。虽然代码中有一点点重复,但还不算太糟,是吧?

用重复代码删除重复项?

这有些讽刺,但很难避免,是不是?

从列表中删除重复项的代码本身是重复的。

有时这种情况是不可避免的,有时创建一个小函数抽取出重复代码可能会有帮助。不过这里好像还有点问题hellip;hellip;.

用集合删除重复项

除了列表,Python还提供了集合数据结构,他的表现类似于你在数学课上学到的集合。

Python中集合最突出的特性是集合中的数据是无序的,而且不允许重复。如果试图向一个集合增加一个数据项,而该集合中已经包含有这个数据项,Python就会将其忽略。

使用set()BIF创建一个空集合,这是工厂函数的一个例子:

也可以一步完成集合的创建和填充。可以在大括号之间提供一个数据列表,或者指定一个现有列表作为set(0BIF的参数,这就是工厂函数。

列表:

【得意的唱】 “你能做的,我都能做的更好。我总是比你强。”

你能拼出“d-a-t-a l-o-s-s”吗?自动丢掉数据听起来对我来说很危险。

真的吗?

你只是做这个吗?

难道他们就为这个付钱给你?

你想过没有,我喜欢我的重复值。要知道,我非常爱他们。

这种情况很少见,而且,不管怎么说,我总能依靠其他人的帮助帮我去除那些我不需要的重复项

集合:

我不得不说,“不,你办不到。”相反,我来问你:“处理重复项呢?我看到重复项的时候,会自动把他们扔掉。”

不过这正是我要做的,集合不允许有重复的值。

没错。我就是因此而存在hellip;hellip;存储值的集合,如果需要,这会非常有帮助。

这正是我要做的全部工作。

真可笑。你一直在想法设法的回避一个事实,这就是你自己根本无法去除重复项。

对,也许吧。但是当你不需要它们时可就不这么想了。

我想你的意思是“setr()的帮助”,是不是?

太棒了!

你已经完美地处理了教练的数据,而且利用了sorted()BIF,集合和列表推导。想想看,这些技术可以应用到很多不同的场合。你已经逐渐成长为一个Python数据处理专家了!

你的Python工具箱

你已经读完了第5章,并在你的工具箱里增加了一些重要的Python工具。

你选择的数据结构要与数据匹配,这很重要。

而且这个选择将对代码的复杂性带来很大的差别。在Python中,尽管列表和集合确实很有用,但这并不是全部。Python还提供了字典,允许你有效地组织数据,可以将数据与名无关联而不是与数字关联,从而实现加快查找。当Python的内置数据结构无数据与名关联而不是与数字关联,从而实现快速查找。当Python的内置数据无法胜任时,Python class语句还允许你定义自己的数据结构。这一章会介绍这些内容。

第5章最后一个程序的输出正是这个教练想要的结果,但还有一个缺陷:从这个输出无法看出哪个数据属于哪个选手。Kelly教练认为他有办法,他已经向各个数据文件增加了标识数据:

如果使用split() BIF把Sarah的数据抽取到一个列表中,第一个数据项将是Sarah的名字,第二个是她的出生日期,后面是Sarah的计时数据。

下面来分析这种格式,看看如何处理。

代码磁贴

针对上一页最后给出的策略,下面来看实现这个策略的代码。对现在来说,我们主要考虑Sarah的数据。重新拜访本页最下面的代码磁贴来实现所需的列表处理,从Kelly教练的原始数据抽取并处理Sarah的3个最快时间。

提示:pop()方法从指定的列表位置删除并返回一个数据项。

代码磁贴答案

针对上一个最后给出的策略,下面来看实现这个策略的代码,对现在来说,我们主要考虑Sarah的数据。

重新拜访本页最下面的代码磁贴来实现所需的列表处理,从Kelly教练的原始数据抽取并处理Sarah的3个最快时间。

这个程序确实能如你所愿的那样正常工作,这很好hellip;hellip;hellip;只不过你必须指定并创建Sarah的3个变量,以便标识哪个名字、出生日期和计时数据与Sarah关联。如果再增加代码来处理James、Julie和Mikey的数据,这就需要用到多达12个变量。现在还只是在处理4个选手。不过如果要处理40、400或者4000个选手呢?

尽管在“现实生活”中数据是关联的,但在代码中一切都是“支离破碎的”,因为表示Sarah的3部分相关数据分别存储在3个不同的变量中。

使用字典关联数据

列表很不错,不过它并不能作为所有情况的最佳数据结构。下面再来看看Sarah的数据:

这里有一个明确的结构:选手的名字、出生日期和时间列表。

计时数据继续使用一个列表,因为这仍然很合理。不过,下面把计时数据作为另一个数据结构的一部分,利用这个数据结构,将把一个选手的所有数据与单个的变量关联。<!--

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[146417],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。