列表推导式python菜鸟教程,Python列表推导式,并解释它的作用

  列表推导式python菜鸟教程,Python列表推导式,并解释它的作用

  

python视频教程栏目介绍Python列表推导式的使用。

  相关免费学习推荐:python视频教程

  Python派生不适合初学者,因为它非常反直觉,即使对于其他编程语言背景的人也是如此。

  当我们接触到List的使用时,学习的内容是分散的。所以我们缺乏一个关于如何在各种场景下使用List的知识体系。

  本文提供了一些使用List的指南,尽可能地涵盖了所有方面。希望这篇文章能成为你的一站式实用手册。

  使用建议

  1.建议使用迭代法。

  使用List最基本的方法是基于iterable对象创建List对象,iterable对象可以是任何可以迭代元素的Python对象。用法如下。

  iterable中item的表达式]下面的代码显示了一个使用list相关技术创建List对象的示例。在这个例子中,我们定义了一个整数列表,基于这个对象,我们创建了一个保存每个数字的平方数和立方数的列表对象。

  #创建一个整数列表

  整数=[1,2,3,4,5,6]

  #创建正方形和立方体列表

  幂=[(x*x,pow(x,3))对于整数中的x]

  打印(功率)

  [(1,1),(4,8),(9,27),(16,64),(25,125),(36,216)]上面的例子使用List对象作为迭代器。要知道很多类型的对象都是可以迭代的,比如List、Set、Dictionary、String等等。其他数据类型,如pandas包中的范围、地图、过滤器、系列和数据框,是迭代的。下面的代码演示如何使用一些对象。

  #使用范围对象

  integer_range=range(5)

  [x*x for x in integer_range]

  [0, 1, 4, 9, 16]

  #使用系列对象

  进口熊猫作为pd

  pd_series=pd。系列(范围(5))

  打印(pd _系列)

  0 0

  1 1

  2 2

  3 3

  4 4

  dtype: int64

  pd _ series中x的x * x

  [0, 1, 4, 9, 16]2.如果只需要一些元素,应该使用条件语句。

  假设您需要收集满足特定条件的元素并创建一个列表。相关语法如下所示。

  【iterable if条件中item的表达式】if语句用于实现条件判断。下面的代码显示了这种用法的一个简单示例。

  #同时创建一个整数列表

  整数=[1,2,3,4,5,6]

  #过滤出偶数,并创建这些偶数的平方列表

  squares _ of _ evens=[x * x for x in integers if x % 2==0]

  打印((偶数的平方))

  [4, 16, 36]3.使用条件判断语句

  还可以在列表中使用if-else形式的条件判断。语法如下。

  iterable中item的if条件表达式else表达式1]这有点类似于前面的用法。不要混淆这两种用法。在这个例子中,条件语句本身是一个整体。下面的代码提供了一个示例。

  #创建一个整数列表

  整数=[1,2,3,4,5,6]

  #遍历整数中的元素。如果是偶数,取平方数,存入一个新的列表

  大型旅行车的

  ;>> # 如果是奇数,取立方数存入新的列表

  >>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]

  >>> print(custom_powers)

  [1, 4, 27, 16, 125, 36]4.如果有嵌套结构,可以使用嵌套的循环

  有可能可迭代对象中的元素自身也是可迭代的,尽管这种情况不太常见。如果你对嵌套的可迭代对象有兴趣,可以使用 for 来实现循环嵌套。语法如下。

  

[expression for item_outer in iterable for item_inner in item_outer]

  # 与下面的代码等同

  for item_outer in iterable:

   for item_inner in item_outer:

   expression

上面的代码展示了使用for实现嵌套循环的例子。

  

>>> # 创建一个包含元组的列表

  >>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')]

  >>> # 获取元组中的每个价格,以此创建一个一维列表

  >>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]

  >>> print(prices_formatted)

  [5.99, 4.99, 3.5, 4.5]

5.替换高阶函数

  有的人比较习惯函数式编程,比如使用高阶函数也是这种习惯的表现之一。特别说明一下,高阶函数是那些需要使用输入或输出参数的函数。在 Python 中,常用的高阶函数有 map() 和 filter()。

  

>>> # 创建一个 integer 类型的列表

  >>> integers = [1, 2, 3, 4, 5]

  >>> # 使用 map 创建平方数列表

  >>> squares_mapped = list(map(lambda x: x*x, integers))

  >>> squares_mapped

  [1, 4, 9, 16, 25]

  >>> # 使用列表推导式创建平方数列表

  >>> squares_listcomp = [x*x for x in integers]

  >>> squares_listcomp

  [1, 4, 9, 16, 25]

  >>> # 使用 filter 取得 integers 中的偶数列表

  >>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))

  >>> filtered_filter

  [2, 4]

  >>> # 使用列表推导式取得 integers 中的偶数列表

  >>> filterd_listcomp = [x for x in integers if x % 2 == 0]

  >>> filterd_listcomp

  [2, 4]

从上面的例子可以看出,使用 list 的某些特性比使用高阶函数更具有可读性,而且也能实现较复杂的嵌套结构。

  1.不要忘了定义构造函数

  有人认为列表推导式很酷炫,是 Python 特有的功能,所以为了炫耀自己的 Python 水平,即使有更好替代方案也要使用它。

  

>>> # 使用 range 创建列表对象

  >>> numbers = [x for x in range(5)]

  >>> print(numbers)

  [0, 1, 2, 3, 4]

  >>> # 以一个字符串为基础,创建一个小写字母的字符列表

  >>> letters = [x.lower() for x in 'Smith']

  >>> print(letters)

  ['s', 'm', 'i', 't', 'h']

上述例子中,我们使用了 range 和 string,这两种数据结构都是可迭代的,list()构造函数可以直接使用 iterable 创建一个 list 对象。下面的代码提供了更合理的解决方案。

  

>>> # 使用 range 创建列表对象

  >>> numbers = list(range(5))

  >>> print(numbers)

  [0, 1, 2, 3, 4]

  >>> # 以一个字符串为基础,创建一个小写字母的字符列表

  >>> letters = list('Smith'.lower())

  >>> print(letters)

  ['s', 'm', 'i', 't', 'h']

2.不要忘了生成器表达式

  在 Python 中,生成器是一种特殊的可迭代对象,它会延迟加载元素,直到被请求才会加载。这在处理大量数据时会非常高效,它能提升存储效率。相比之下,list 对象为了方便计数和索引,一次性创建所有的元素。所以跟生成器相比,在元素个数相同时,list 需要占用更多内存。

  我们可以定义一个生成器函数来创建生成器。我们也可以使用下面的语句来创建生成器,这是一种称为生成器表达式的方法。

  

(expression for item in iterable)
你可能会注意到,除了使用圆括号外,它的语法跟使用 list 的语句很相似。所以需要注意区分。

  考虑下面这个例子。我们要计算前一百万个数字的平方和。如果使用 list 来实现,方法如下。

  

>>> # 创建列表对象 squares

  >>> squares = [x*x for x in range(10_000_000)]

  >>> # 计算它们的总和

  >>> sum(squares)

  333333283333335000000

  >>> squares.__sizeof__()

  81528032

如上所示,list 对象占据 81528032 字节。我们考虑使用 generator 进行相同的操作,代码如下。

  >>> # 创建 generator 对象,保存每个数的平方数

  >>> squares_gen = (x*x for x in range(10_000_000))

  >>> # 计算它们的总和

  >>> sum(squares_gen)

  333333283333335000000

  >>> squares_gen.__sizeof__()

  96

跟使用 list 相比,使用 generator 内存开销小得多,只有 96 字节。原因很简单———— generator 不需要获取所有的元素。相反,它只需要获取各个元素在序列中的位置,创建下一个元素并呈现它,而且不必保存在内存中。

  结论

  本文中,我们整理了 list 应用的一些关键要领。这些该做的和不该做的都非常清晰明了。我估计你会在合适的场景中用到它。下面是本文内容的小结。

  使用迭代的方式。Python 中有许多类型的 iterable,你应当在掌握基础(list 和 tuple)的同时融会贯通。

  使用条件判断语句。如果你对在 iterable 中筛选某些元素感兴趣,可以多多研究条件判断。

  使用条件判断表达式。如果你需要有选择性地获取某些数据,可以使用条件判断表达式。

  使用嵌套的循环。如果你要处理嵌套的 iterable,可以使用嵌套的循环结构。

  用 list 替代高阶函数在很多情况下,可以用 list 替代高阶函数。

  不要忘记 list 的构造函数定义 list 的构造函数,可以使用 iterable 创建一个 list 对象。如果你直接使用 iterable,推荐用这个方法。

  不要忘了生成器表达式它的语法与 list 中的语法相似。在处理大量的对象时,这是一种节省内存开销的办法。list 和 generator 不同的是,为了日后的索引和访问, list 必须提前创建,如果元素个数很多,就会消耗很大的内存。以上就是Python 列表推导式使用的注意事项的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: