查看原文
其他

Python数据类型-List介绍(下)-列表推导式

Lemon Python数据之道 2022-09-04

列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用。


本文是 Python数据类型-List介绍(上) 的姊妹篇。


通过这两篇文章来对List做一个相对系统的介绍,希望对于熟悉list有所帮助。


 Start 


本文的运行环境:

  • windows7系统

  • python3.5

  • jupyter notebook



6 列表推导式(List Comprehension)

6.1 列表推导式的一般情况

列表推导式的一般语法结构:

new_list = [for x in iterable]

其中的 iterable 表示可迭代的对象,包括字符串(str)、列表(list),元组(tuple)、字典(dict)、集合(set),以及生成器(generator)等。

先来看几个简单的例子:

  1. str_list = [x.lower() for x in "Lemon"]

  2. str_list

  1. ['l', 'e', 'm', 'o', 'n']

  1. list_list = [x**2 for x in [1,2,3,4]]

  2. list_list

  1. [1, 4, 9, 16]

  1. tuple_list = [x+2 for x in (1,2,3,4)]

  2. tuple_list

  1. [3, 4, 5, 6]

  1. ge_list = [x for x in range(8)]

  2. ge_list

  1. [0, 1, 2, 3, 4, 5, 6, 7]

6.2 两层for循环的列表推导式

列表推导式中,可以同时包含多个for循环,比如同时两个for循环,如下:

  1. [x**2+y for x in range(5) for y in range(4,7)]

  1. [4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]

上述结果跟下面的写法结果是一致的:

  1. two_for_list = []

  2. for x in range(5):

  3.    for y in range(4,7):

  4.        two_for_list.append(x**2+y)

  5. print(two_for_list)

  1. [4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]

列表推导式中,三层或者三层以上的for循环一般很少用到。

6.3 使用两个变量来生成list

列表推导式也可以使用两个或多个变量来生成list,结合字典的使用,举例如下:

  1. d = {'x': '1', 'y':'2', 'z':'4'}

  2. d_list = [k+'='+v for k,v in d.items()]

  3. d_list

  1. ['z=4', 'y=2', 'x=1']

6.4 含if语句的列表推导式

列表推导式中还可以引入 if 条件语句,如下:

  1. if_list = [x**2 for x in range(10) if x%2==0]

  2. if_list

  1. [0, 4, 16, 36, 64]

上述列表推导式,如果用普通的for循环来编写的话,内容如下:

  1. if_list_1 = []

  2. for x in range(10):

  3.    if x%2==0:

  4.        if_list_1.append(x**2)

  5. print(if_list_1)

  1. [0, 4, 16, 36, 64]

通过对比,可以看出列表推导式的方式更显得 Pythonic。

当然,如果仅仅是编写上更简洁,可能不一定能显现出 列表推导式的优势,下面我们来对比下上述两种方式的运行效率。

  1. %%timeit

  2. if_list = [x**2 for x in range(10) if x%2==0]

  3. if_list

  1. 100000 loops, best of 3: 6.06 µs per loop

  1. %%timeit

  2. def for_loop():

  3.    if_list_1 = []

  4.    for x in range(10):

  5.        if x%2==0:

  6.            if_list_1.append(x**2)

  7.    return if_list_1

  8. for_loop()

  1. 100000 loops, best of 3: 6.76 µs per loop

从上面的运行结果进行对比,可以看出列表推导式的运行效率要高于普通的 for循环编写方式。

因为,建议大家使用列表推导式,不仅写法更 Pythonic,且运行效率更高。

包含if-else语句的列表推导式

  1. [x**2 if x%2==0 else x+2 for x in range(10)]

  1. [0, 3, 4, 5, 16, 7, 36, 9, 64, 11]

包含两个if语句的列表推导式

  1. [x**2 for x in range(10) if x%2==0 if x%3==0]

  1. [0, 36]

7 小结

如果想获取离散的元素,比如想获得第1、2、4个元素,能不能通过离散的索引值来获取呢?

前面已经实践过,直接通过离散的索引值来获取列表中的元素是不行的。

通过列表推导式的学习,我们可以换一种思路,来实现列表中离散的元素的获取,如下:

  1. [c_list[i] for i in [0,1,3]]

  1. ['James', 'Ava', 'Emma']

列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用,希望上述内容能对于熟悉list有所帮助。


如果您喜欢我的文章,欢迎推荐给您的朋友!


 End 


精选文章(点击图片即可查看文章):

公众号精华文章推荐


公众号导航

ID:PyDataRoad



  • 微信公众号后台回复数字「 8 」,访问个人官网。

  • 微信公众号后台回复数字「 1 」,获取公众号导航内容,包括部分文章源代码,精华文章等。

  • 在微信公众号后台回复「 微信群 」,和小伙伴们一起入群。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存