python数据类型-List介绍(下)
6 列表推导式(List Comprehension)
6.1 列表推导式的一般情况
列表推导式的一般语法结构:
new_list = [x for x in iterable]
其中的 iterable 表示可迭代的对象,包括字符串(str)、列表(list),元组(tuple)、字典(dict)、集合(set),以及生成器(generator)等。
先来看几个简单的例子:
-
str_list = [x.lower() for x in "Lemon"] -
str_list
-
['l', 'e', 'm', 'o', 'n']
-
list_list = [x**2 for x in [1,2,3,4]] -
list_list
-
[1, 4, 9, 16]
-
tuple_list = [x+2 for x in (1,2,3,4)] -
tuple_list
-
[3, 4, 5, 6]
-
ge_list = [x for x in range(8)] -
ge_list
-
[0, 1, 2, 3, 4, 5, 6, 7]
6.2 两层for循环的列表推导式
列表推导式中,可以同时包含多个for循环,比如同时两个for循环,如下:
-
[x**2+y for x in range(5) for y in range(4,7)]
-
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]
上述结果跟下面的写法结果是一致的:
-
two_for_list = [] -
-
for x in range(5): -
for y in range(4,7): -
two_for_list.append(x**2+y) -
print(two_for_list)
-
[4, 5, 6, 5, 6, 7, 8, 9, 10, 13, 14, 15, 20, 21, 22]
列表推导式中,三层或者三层以上的for循环一般很少用到。
6.3 使用两个变量来生成list
列表推导式也可以使用两个或多个变量来生成list,结合字典的使用,举例如下:
-
d = {'x': '1', 'y':'2', 'z':'4'} -
d_list = [k+'='+v for k,v in d.items()] -
d_list
-
['z=4', 'y=2', 'x=1']
6.4 含if语句的列表推导式
列表推导式中还可以引入 if 条件语句,如下:
-
if_list = [x**2 for x in range(10) if x%2==0] -
if_list
-
[0, 4, 16, 36, 64]
上述列表推导式,如果用普通的for循环来编写的话,内容如下:
-
if_list_1 = [] -
for x in range(10): -
if x%2==0: -
if_list_1.append(x**2) -
-
print(if_list_1)
-
[0, 4, 16, 36, 64]
通过对比,可以看出列表推导式的方式更显得 Pythonic。
当然,如果仅仅是编写上更简洁,可能不一定能显现出 列表推导式的优势,下面我们来对比下上述两种方式的运行效率。
-
%%timeit -
-
if_list = [x**2 for x in range(10) if x%2==0] -
if_list
-
100000 loops, best of 3: 6.06 µs per loop
-
%%timeit -
-
def for_loop(): -
if_list_1 = [] -
for x in range(10): -
if x%2==0: -
if_list_1.append(x**2) -
return if_list_1 -
-
for_loop()
-
100000 loops, best of 3: 6.76 µs per loop
从上面的运行结果进行对比,可以看出列表推导式的运行效率要高于普通的 for循环编写方式。
因为,建议大家使用列表推导式,不仅写法更 Pythonic,且运行效率更高。
包含if-else语句的列表推导式
-
[x**2 if x%2==0 else x+2 for x in range(10)]
-
[0, 3, 4, 5, 16, 7, 36, 9, 64, 11]
包含两个if语句的列表推导式
-
[x**2 for x in range(10) if x%2==0 if x%3==0]
-
[0, 36]
7 小结
如果想获取离散的元素,比如想获得第1、2、4个元素,能不能通过离散的索引值来获取呢?
前面已经实践过,直接通过离散的索引值来获取列表中的元素是不行的。
通过列表推导式的学习,我们可以换一种思路,来实现列表中离散的元素的获取,如下:
-
[c_list[i] for i in [0,1,3]]
-
['James', 'Ava', 'Emma']
列表(list)作为python最基础也是最重要的数据类型之一,在python数据分析以及其他用途中有着重要的作用,希望上述内容能对于熟悉list有所帮助。

浙公网安备 33010602011771号