频道直达
八强网 > 实务 > 编程语言 > 正文阅读
关键词

Python数据驱动变换表推导式

www.8tops.com 2007-10-14 15:16:47   发布:站长资讯
媒体:站长资讯  作者:站长资讯

时间:2007-10-11 10:33:27  来源:站长资讯收集整理  作者:最初,表推导式通过功能性程序设计语言Haskell而普及,它为我们提供了一种使用Python语言编码的不同方法,它可以让我们将重心放在要转换的数据而不是使用的功能。

使用表推导式完成的所有任务都可以使用内建的映像和过滤函数完成,但是表推导式为我们提供了一个更容易使用和更易于理解的语法。本文,我们将通过几个简单的例子来向大家介绍表推导式的功能。

当在Python中指定一个列表时,我们需要将所有表项列举出来,并用中括号包围起来,如下所示:

>>> wordlist = ["HELLO", "World", "how", "aRe", "YOU?"]

当使用表推导式时,除了不用列举各个表项内容之外,方法基本一样。我们使用另外一个列表的转换来描述列表内容。让我们举个例子来看一下:我们想要获得单词列表并将它们转换成小写。通常我们会使用下面的方式完成:

>>> l = []

>>> for word in wordlist:

l. append(word.lower())

>>> l

["hello", "world.", "how", "are", "you?"]

但是,这样写太长了而且很慢,因为当我们使用for语句时,Python需要完成潜在的循环。如果我们使用功能性编程,可以这样编码实现:

>>> import string

>>> map(string.lower,wordlist)

["hello", "world.", "how", "are", "you?"]

这是一个改进,但是有点模糊。通过使用表推导式的方法代替可以这样来写:

>>> [word.lower() for word in wordlist]

["hello", "world.", "how", "are", "you?"]

第二种写法长度并没有减少,但是在很多情况下更清楚一些。你可以决定那种方法更适合你的环境。

表推导式还可以完全代替内建的过滤函数,例如,如果你只想取出列表中已经是小写字母的单词,就可以这样编码:

>>> [word for word in wordlist if world.islower()]

["how"]

映像和过滤函数是功能性程序设计的基础,在使用表推导式时,我们可以以直接的方式使用其中的一个函数或同时使用这两个函数。如果我们想在一个表达式中同时使用映像和过滤函数,这很简单,如下面例子所示:

>>> [word.lower() for word in wordlist if not world.islower()]

["hello", "world.", "are", "you?"]

还可以在第一部分嵌套使用表推导式,如下所示:

>>> vowels = ["a","A","e","E","i","I","o","O","u","U"]]

>>> [[letter for letter in word if letter not in vowels] for word in wordlist]

[["H", "L", "L"], ["W", "r", "l", "d"], ["h", "w"], ["R"], ["y", "?"]]

或者在后半部分使用嵌套,将多个转换连接在一起,如下所示:

>>> [a.lower() for a in [b[i] for b in x for i in range(len(b))]]
["h", "e", "l", "l", "o", "w", "o", "r", "l", "d", "h", "o", "w", "a", "r", "e", "y", "o", "u", "?"]

正如我们所看到的,当我们开始将多个表推导式连接在一起的时候,问题就变得复杂了。因此,当在一个表达式中有多个表推导式时,将不同条件分解成多行书写是一个好主意。虽然我们并不总是需要嵌套使用表推导式,但是如果我们只是需要迭代使用多个列表的话,我们就可以将它们包含在一个表推导式中。

在下面的例子中,我们想要生成所有参加宴会的嘉宾的置换,就可以简单地使用一个表推导式完成该任务。

>>> guests = ["Chris", "Brendan", "Jimmy", "Mel", "Mike", "Jess"]
>>> [(seat1, seat2) for seat1 in guests for seat2 in guests if seat1 != seat2]
[("Chris", "Brendan"), ("Chris", "Jimmy"), ("Chris", "Mel"), ("Chris", "Mike"), ("Chris", "Jess"), ("Brendan", "Chris"), ("Brendan", "Jimmy"), ("Brendan", "Mel"), ("Brendan", "Mike"), ("Brendan", "Jess"), ("Jimmy", "Chris"), ("Jimmy", "Brendan"), ("Jimmy", "Mel"), ("Jimmy", "Mike"), ("Jimmy", "Jess"), ("Mel", "Chris"), ("Mel", "Brendan"), ("Mel", "Jimmy"), ("Mel", "Mike"), ("Mel", "Jess"), ("Mike", "Chris"), ("Mike", "Brendan"), ("Mike", "Jimmy"), ("Mike", "Mel"), ("Mike", "Jess"), ("Jess", "Chris"), ("Jess", "Brendan"), ("Jess", "Jimmy"), ("Jess", "Mel"), ("Jess", "Mike")]

这并不要替换程序中的每一个部分,只需要在你的Python工具箱里面添加一个表推导式即可。然后很快就可以看到它能够使你的程序比以前变得更短小、更清晰、更快速。因为它们重心在于数据而不是过程,而且他们很容易编写,即使当你的需求很复杂时也一样。


本篇文章来源于 站长资讯网 原文链接:http://webdevelop.chinahtml.com/5/2007/119207009216496.shtml

八强网,更多精彩在首页,
八强网首页
网友评论

发表

我也评两句
 
发文时请务必注意:
一、遵守国家相关法律规定,如 《北京地区互联网站电子公告服务倡议书》《全国人大常委会关于维护互联网安全的决定》 及中华人民共和国其他各项有关法律法规。一旦违犯法律法规,您将承担一切因您的行为而直接或间接导致的民事或刑事法律责任,本站工作人员有义务配合相关部门,提供必要的技术资料(如IP地址等)。
二、自觉遵守爱国、守法、自律、真实、文明的原则,严禁发表有人身攻击倾向、有造谣生事嫌疑的言论,严禁发表虚假广告、色情、网络传销性质的内容,本站管理人员有权删除违反规定的内容或取消违规网友的发文权限甚至删除其ID。
互联网产业作家
网站提交】【八强自荐
将八强网设为首页 将八强网添加到收藏夹 将八强网推荐给朋友 网络实名、通用网址:八强网
关于我们 - 联系合作 - 广告服务 - 友情链接 - 支持单位 - 免责声明
基于E-file技术构建 版权所有Copyright©2006 京ICP备06061834号