Python数据驱动变换表推导式


最初,表推导式通过功能性程序设计语言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工具箱里面添加一个表推导式即可。然后很快就可以看到它能够使你的程序比以前变得更短小、更清晰、更快速。因为它们重心在于数据而不是过程,而且他们很容易编写,即使当你的需求很复杂时也一样。

相关文章】

  • 深入了解Python暂缓列表生成器
  • Python:你所需要的第一种也是最后一种语言
  • 用Python WSGI混和并匹配Web组件

评论关闭