查看: 6076|回复: 0
打印 上一主题 下一主题

Python数据驱动变换表推导式

[复制链接]
跳转到指定楼层
1#
发表于 2007-10-11 14:42:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
最初,表推导式通过功能性程序设计语言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工具箱里面添加一个表推导式即可。然后很快就可以看到它能够使你的程序比以前变得更短小、更清晰、更快速。因为它们重心在于数据而不是过程,而且他们很容易编写,即使当你的需求很复杂时也一样。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表