python列表解析

列表解析即与函数工具(map和filter)有关,又与循环有关,
Python的迭代也包括用户定义的类,
列表解析把任意一个表达式而不是一个函数用于一个迭代对象中的元素,

列表解析与map:
ord('s')
#115

res = []
for x in 'spam':
res.append(ord(x))
res
等同于:
res=list(map(ord,'spam'))
res
由此:我们能够通过列表解析表达式得到相同结果--map把一个函数映射遍一个序列,
列表解析把表达式映射遍一个序列
res = [ord(x) for x in 'spam']
res

列表解析在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表并返回,
[x ** 2 for x in range(10)]

list(map(lamdax:x ** 2),range(10)))
这样比列表解析编写更少的代码,只是稍微复杂了点,但是对于更高级的表达式,
列表解析会被认为是输入较少的。

1.增加测试和嵌套循环
列表解析甚至要比现在所介绍的更通用,可以在for之后编写一个if分支,用来增加选择逻辑,使用了if
分支的列表解析能够当成一种与上一部分讨论的内置filter类似的工具,他们会在分支不是真的情况下跳过一些序列的元素。

[x for x in range(5) if x % 2 == 0]

list(filter((lamda x:x % 2 == 0),range(5)))

res = []
for x in range(5):
if x % 2 == 0:
res.append(x)
res

在列表解析中能够混合一个if分支以及任意的表达式,从而赋予它通过单个表达式,完成了filter和一个map相同的功能。

再者:
[x ** 2 for x in range(10) if x % 2 == 0]

list(map(lamda x:x ** 2),filter(lamda x:x % 2 == 0,range(10)))

实际上列表解析还能更加通用,你可以在列表解析中编写任意数量的嵌套的for循环,并且每一个都有可选的关联if测试,
通用的列表解析的结构如下:
[expression for target1 in iterable1 [if condition1]
for target2 in iterable2 [if condition2]
for targetN in iterable2N [if conditionN]
]

for分句嵌套在列表解析中,他们工作起来就像等效的嵌套的for循环语句。如下语句:

res = [x + y for x in [0,1,2,3,4,5] for y in [100,200,300]]
res
===
res = []
for x in [0,1,2]:
for y in [100,200,300]
res.append(x+y)
res

尽管列表解析创建了列表,记住他们能够像任意的序列和其他迭代类型一样进行迭代,
在这里有一个小技巧:
能够不使用列表的数字索引遍历字符串,并收集他们合并后的结果:
[x + y for x in 'spam' for y in 'SPAM']

更复杂的列表解析工具,表明在嵌套for的从句中附加if选择的作用。
[(x + y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
等效的代码:
res = []
for x in range(5):
if x % 2 == 0:
for y in range(5):
if y % 2 == 1:
res.append((x,y))
res

复杂的列表解析,总是可以将列表解析的for和if分句在其中进行嵌套,得到等效的语句。
map和filter等效的形式将会更复杂,会有深层的嵌套。

posted @ 2017-08-15 22:45  玲珑醉  阅读(844)  评论(0编辑  收藏  举报