打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python之列表推导式

如下是Python官方文档中列表推导式部分的译文,笔者对于该部分也是初学,只能从官方文档学起了。有不合适的地方还望指正,谢谢。

Python官网列表推导式部分

一 列表推导式

  列表推导式提供了一种创建list的简便方法。应用程序创建列表时,列表中的元素来源于其他序列、可迭代对象或创建的一个满足一定条件的序列。
  例如,假设我们要创建一个平方数组成的列表,比如:
  1. squares = []  
  2. for x in range(10):  
  3.     squares.append(x**2)  
  4. print(squares)  
输出结果:
  1. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]  
我们也可以通过下面的方式获得相同的列表:

  1. squares = [x**2 for x in range(10)]  
这也等价于下面的方式,但列表推导式的方式更简单。
  1. squar = map(lambda x:x**2,range(10))  
对于函数map(function,iterable),其含有两个参数,第一个参数function是一个函数,第二个参数是一个列表。列表中的每一个元素调用函数function,结果构成一个新的序列。

关于map()函数和map对象,请参考:

关于lambda,请参考:

列表推导式包含一对括号,在括号中有一个表达式,表达式后面紧跟一条for语句,然后是零条或多条,for语句或if语句。通过for语句和if语句计算出表达式,结果作为新列表的元素。例如,下面的列表推导式将两个不同列表中的元素整合到了一起:

  1. >>> [(x,y)for x in [1,2,3] for y in [3,1,4] if x != y]  
  2. [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]  
这等价于:
  1. >>> combs = []  
  2. >>> for x in [1,2,3]:  
  3.     for y in [3,1,4]:  
  4.         if x != y:  
  5.             combs.append((x,y))  
  6.   
  7. >>> combs  
  8. [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]  
注意:for语句和if语句在这两段程序片中的顺序是相同的。

如果表达式是一个元组(例如前面例子中的(x,y)),那么必须得给它加上括号。
  1. >>> vec = [-4,-2,0,2,4]  
  2. >>> #用vec中元素的倍数,创建一个数组  
  3. >>> [x*2 for x in vec]  
  4. [-8, -4, 0, 4, 8]  
  5. >>> #过滤列表,删除列表中的负数  
  6. >>> [x for x in vec if x >= 0]  
  7. [0, 2, 4]  
  8. >>> #对列表中的每个元素应用一个函数  
  9. >>> [abs(x) for x in vec]  
  10. [4, 2, 0, 2, 4]  
  11. >>> #对每个元素调用一个方法  
  12. >>> freshfruit = ['000banana00','0000loganberry0','0passion fruit00000']  
  13. >>> [weapon.strip('0') for weapon in freshfruit]#str.strip(ch) : 删除字符串开头结尾处的字符ch  
  14. ['banana', 'loganberry', 'passion fruit']  
  15. >>> #创建一个2元元组,比如(number,square)  
  16. >>> [(x,x**2) for x in range(6)]  
  17. [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]  
  18. >>> #元组必须用括号包围,不然就会出错  
  19. >>> [x,x**2 for x in range(6)]  
  20. SyntaxError: invalid syntax  
  21. >>> #将一个多维数组转化为一个一维数组  
  22. >>> vec =  [[1,2,3],[4,5,6],[7,8,9]]  
  23. >>> [num for elem in vec for num in elem]  
  24. [1, 2, 3, 4, 5, 6, 7, 8, 9]  
列表推导式可以包含复杂表达式和嵌套函数;

  1. >>> from math import pi  
  2. >>> [str(round(pi,i)) for i in range(1,6)]  
  3. ['3.1', '3.14', '3.142', '3.1416', '3.14159']  
对于round函数,其本身的执行与Python的版本有关和计算机的精度有关,详情请参考下面的链接,此处可简单理解为取pi的i位有效数字。


二 嵌套列表推导式

列表推导式中,最基本的表达式可以是任意表达式,包括其他列表推导式。

下面的3*4的矩阵,可以当做一个列表list,该列表由3个长度为4的子列表的组成:

  1. >>> matrix = [  
  2.     [1,2,3,4],  
  3.     [5,6,7,8],  
  4.     [9,10,11,12],  
  5.     ]  
  6. >>> matrix  
  7. [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]  
使用下面的列表推导式转置行和列:

  1. >>> [[row_list[j] for row_list in matrix]for j in range(4)]  
  2. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]  
从前面的小节中可以看出,嵌套的列表推导式是在for循环的body中进行计算的,所以上满的例子等同于:

  1. >>> transposed = []  
  2. >>> for j in range(4):  
  3.     transposed.append([row[j] for row in matrix])  
  4. >>> transposed  
  5. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]  
也等同于:
  1. >>> transposed  
  2. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]  
  3. >>> transposed = []  
  4. >>> for j in range(4):  
  5.     #下面的三行实现了嵌套列表推导式  
  6.     transposed_row = []  
  7.     for row_list in matrix:  
  8.         transposed_row.append(row_list[j])  
  9.     transposed.append(transposed_row)  
  10.   
  11. >>> transposed  
  12. [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]  
在现实情况中,与复杂的流式语句相比,你可能更喜欢Python的内置函数。那么,zip()函数就更适合与完成上面的工作了。

  1. >>> zipp = zip(*matrix)  
  2. >>> list(zipp)  
  3. [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]]  
关于zip()函数,请参考:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python:eval的妙用和滥用
情感分析利器——Doc2vec
Python中read和write用法
Python语法基础
python 一个.py文件如何调用另一个.py文件中的类和函数
Python中的基本语句
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服