当前位置:   article > 正文

Python之列表推导式_python3列表推倒

python3列表推倒

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

Python官网列表推导式部分

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

squares = [x**2 for x in range(10)]
这也等价于下面的方式,但列表推导式的方式更简单。
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. >>> combs
  7. [(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. >>> transposed
  11. [[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()函数, 请参考:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/207904?site
推荐阅读
相关标签
  

闽ICP备14008679号