热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » 生活百科 » Python数据驱动变换表推导式

Python数据驱动变换表推导式

论坛链接
  • Python数据驱动变换表推导式
  • 发布时间:2007-10-11 14:42:34    浏览数:6098    发布者:superadmin    设置字体【   
最初,表推导式通过功能性程序设计语言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 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工具箱里面添加一个表推导式即可。然后很快就可以看到它能够使你的程序比以前变得更短小、更清晰、更快速。因为它们重心在于数据而不是过程,而且他们很容易编写,即使当你的需求很复杂时也一样。
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理