Python 列表解析

来源:互联网 发布:大富豪5.2源码 编辑:程序博客网 时间:2024/06/03 18:07

原地址:http://blog.csdn.net/ryuali2010/article/details/7922577

列表解析

在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。它的基本形式是一个方括号里面包含一个for语句对一个iterable对象迭代

[python] view plain copy
  1. >>> res=[ord(x) for x in 'spam']  
  2. >>> res  
  3. [11511297109]  
  4. >>> [x**2 for x in range(10)]  
  5. [0149162536496481]  

增加测试语句和嵌套循环

[expression for target1 in iterable1 [if condition1]...

                      for targetn in iterablen [if conditionn] ]

上面是列表解析中,任意数量嵌套的for循环同时关联可选的if 测试,其中if 表示测试语句是可选的,如果没有的话,就是我们上面的例子,注意for上下之间表示的是一个嵌套关系。

第一个是表达式,比较形式[(x,y), [0,2,4],[1,3]]与下面形式的区别

[python] view plain copy
  1. >>> [(x,y) for x in range(5if x % 2==0 for y in range(5if y % 2 ==1]  
  2. [(01), (03), (21), (23), (41), (43)]  
map,lambda,filter的组合同样会达到一个进行测试的效果,但是如何实现嵌套我现在不太清楚

[python] view plain copy
  1. >>> list(map((lambda x:x**2),filter((lambda x:x%2==0),range(10))))  
  2. [04163664]  
我也试着写了一下如何等价与上面的嵌套,但是失败了,因为map的逻辑是每次都从后面序列中取出一个,以最少的为标准。如何实现x固定,遍历y呢?

[python] view plain copy
  1. >>> list(map((lambda x,y:(x,y)),filter((lambda x:x%2==0),range(5)),filter((lambda y:y%2==1),range(5))))  
  2. [(00), (22), (44)]  
  3. >>> list(map((lambda x,y:(x,y)),filter((lambda x:x%2==0),range(5)),filter((lambda y:y%2==1),range(5))))  
  4. [(01), (23)]  
列表解析和矩阵

如何生成矩阵?见Python 生成矩阵 

[python] view plain copy
  1. >>> rect  
  2. [[123], [345]]  
  3. >>> [row[1for row in rect]            #访问指定列中的元数  
  4. [24]  
  5. >>> rect[1]                             #访问指定行的元素  
  6. [345]  
  7. >>> [rect[row][1for row in range(2)]  #访问指定位置元数  
  8. [24]  
列表解析

map和列表解析是在解释器中以C语言的速度来运行,比Python的for循环代码在pvm中运行要快的多。

[python] view plain copy
  1. >>> open("tut1.m").readlines()  
  2. ['aaa\n''bbb\n''ccc\n']  
  3. >>> [line.rstrip() for line in open("tut1.m").readlines()]        #消除文件中的换行  
  4. ['aaa''bbb''ccc']  
  5. >>> [line.rstrip() for line in open("tut1.m")]  
  6. ['aaa''bbb''ccc']  
  7. >>> list(map((lambda line: line.rstrip()), open("tut1.m")))  
  8. ['aaa''bbb''ccc']  

第一种方式:因为readlines()方法,把整个文件都放入到内存中。然后对string进行解析

第二种方式:使用了文件迭代器,进行列表解析。

第三种方式:Map同样使用了文件迭代器,但是它不是列表解析,因为它两边不是[]引起来的。

上面二,三方式使用了迭代器,都不会一次性构建列表,所以节省了内存空间。


原创粉丝点击