2007-08-26

 

Python Cookbook 4.2 用递推式构造列表(List Comprehensions)

需求:

你需要构造一个新的列表,列表中的元素是从一个已知列表中的元素计算而得到的.

讨论:

比如你要创建一个列表,里面的元素是另一个列表中的元素加23后得到的.使用递推式构造列表是最理想的方法:

thenewlist = [x + 23 for x in theoldlist]

如果你希望用一个列表中大于5的元素构造一个新的列表,使用递推式也是很方便的:

thenewlist = [x for x in theoldlist if x > 5]

如果你希望将上面的两种情况组合起来,可以使用if表达式, 还可以使用计算式.比如给选中的元素加23,用一句话写成:

thenewlist = [x + 23 for x in theoldlist if x > 5]

优雅,清晰和实用,是Python的核心思想.递推式表现了3者的完美接合.的确,递推式是构造列表的最好方法,有时候,甚至也是修改列表的不错的选择.比如,你需要将列表中大于100的数改成100,可以这样写:

L[:] = [min(x,100) for x in L]

给列表的完整切片赋值会修改列表的内容,而不是仅仅重新绑定变量名,如果你写成L=...就是重新绑定变量名了.
如果你仅仅想对列表进行迭代,最好还是使用循环,而不是递推式,可以参考下一节.
如果有另外的内建方法可以完成同样的功能,最好也不要使用迭代式.比如复制列表 ,使用L1 = list(L),不要用:

L1 = [x for x in L]

另外,如果要对列表中的每一个元素进行函数操作,并将其返回值作为元素使用,请使用map函数,L1 = map(f,L),而不是[f(x) for x in L].不过在大多数情况下,使用递推式是比较方便的.
在Python2.4中,如果列表比较长,而且你一次只需要其中的一个元素, 使用生成表达式比较合适.生成表达式的写法和递推式是很类似的,它使用()来区分.在Python2.3中,比如我们要获得列表元素的和,而不是其中的每一个元素,可以这样写:

total = sum([x + 23 for x in theoldlist if x > 5])

在Python2.4中,可以不要[]:

total = sum(x + 23 for x in theoldlist if x > 5)

除了少写一对[],表达式也避免了维护一个列表,节省了内存空间.尤其当列表很长的时候,可以提高速度.

标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?