1. 列表推导式
列表推导式又称为列表解析式,作用在于通过一种简明扼要的方法来创建列表。列表推导式的结构为:[expression for item in iterable]
,其中item是一个临时变量,expression是基于临时变量item的某种表达式,iterable是可迭代对象(如列表、元组、字符串、集合等)。就不过多文字介绍了,直接看下面的代码例子。
(1)一个简单例子:1~10内整数的平方。
square_list = [i**2 for i in range(11)]
print(square_list)
输出结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
(2)包含判断筛选(if语句):1~10内偶数的平方。
even_square_list = [i**2 for i in range(11) if i%2 == 0]
print(even_square_list)
输出结果:
[0, 4, 16, 36, 64, 100]
(3)包含循环嵌套和判断筛选:将二维列表my_list(列表嵌套列表)扁平化为一维列表,并限制新列表中元素为偶数。
my_list = [[1,2,3],[4,5,6],[7,8,9]]
even_list = [x for y in my_list for x in y if x%2 ==0]
print(even_list)
"""
[x for y in my_list for x in y if x%2 ==0]大致分为三部分:
(1) for y in my_list: 取出my_list中每个元素,将获得的列表赋给临时变量y
(2) for x in y: 遍历列表y中每个元素, 并将该元素赋给临时变量x
(3) if x%2 ==0: 判断元素x是否为偶数
"""
输出结果:
[2, 4, 6, 8]
列表推导式的语法虽然简洁,但对于复杂的操作,列表推导式难以理解。
参考文章:深入理解 Python 列表推导式:从基础到高阶应用
2. slice(切片)
序列类型是指:内容连续、有序,可使用下标索引的一类数据容器,列表、元组和字符串均可视为序列类型的对象。切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。
切片的语法格式:序列类型[起始下标:结束下标:步长]
。其中,
(1)起始下标(包含该索引本身)表示从何处开始,可以省略,省略时表示从头开始(默认为0);
(2)结束下标(不包含该索引本身)表示在何处结束,可以省略,省略时表示截取到末尾(默认为序列长度);
(3)步长表示依次取出元素的间隔,步长为负数表示反向取出。当步长省略时,默认为1。
下面对列表、字符串和元组进行切片操作。
2.1 列表的切片
obj_list = [2,4,6,8,10,12]
print(obj_list[1:5]) # 输出:[4, 6, 8, 10]
print(obj_list[::]) # 输出:[2, 4, 6, 8, 10, 12]
print(obj_list[:]) # 输出:[2, 4, 6, 8, 10, 12]
print(obj_list[::-1]) # 输出:[12, 10, 8, 6, 4, 2]
2.2 字符串的切片
obj_str = "hello world"
print(obj_str[1:5]) # 输出:ello
print(obj_str[::]) # 输出:hello world
print(obj_str[:]) # 输出:hello world
print(obj_str[::-1]) # 输出:dlrow olleh
2.3 元组的切片
obj_tuple = (2,4,6,8,10,12)
print(obj_tuple[1:5]) # 输出:(4, 6, 8, 10)
print(obj_tuple[::]) # 输出:(2, 4, 6, 8, 10, 12)
print(obj_tuple[:]) # 输出:(2, 4, 6, 8, 10, 12)
print(obj_tuple[::-1]) # 输出:(12, 10, 8, 6, 4, 2)
2.4 slice()函数
slice()
是python内置的函数,用于创建切片对象(slice对象)。切片对象可以指定对序列进行切片操作的起始、终止和步长。slice
函数的语法格式为:slice(start, end, step)
(和上面切片的语法格式类似)。其中,start
为起始位置,默认为0;end
为结束位置,默认为序列长度;step
为步长,默认为1。
我们可以通过slice()
函数创建一个切片对象(slice对象),如下代码所示:
my_slice1 = slice(1,5)
my_slice2 = slice(6)
print(my_slice1) # 输出:slice(1, 5, None)
print(my_slice2) # 输出:slice(None, 6, None)
# 在创建slice对象的时候,如果我们没有在slice()函数中显式的指定start、step,
# 那么创建的slice对象中start、step的位置为None。
下面是slice函数的应用:
obj_list = [2,4,6,8,10,12]
my_slice1 = slice(1,4) # 创建切片对象,指定起始位置为1,结束位置为4
print(obj_list[my_slice1]) # 输出:[4, 6, 8]
my_slice2 = slice(len(obj_list)) # 创建切片对象,指定起始位置为0,结束位置为序列长度
print(obj_list[my_slice2]) # 输出:[2, 4, 6, 8, 10, 12]
列表的切片obj_list[1:5]
等价于obj_list[slice(1,5)]
(字符串和元组也一样),代码如下:
obj_list = [2,4,6,8,10,12]
print(obj_list[1:5]) # 输出:[4, 6, 8, 10]
print(obj_list[slice(1,5)]) # 输出:[4, 6, 8, 10]
# 也就是说切片操作obj_list[1:5]中的 "1:5"
# 等价于obj_list[slice(1,5)]中的 slice(1,5)。"1:5"是一个slice对象。