python中列表推导式和切片(slice)

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对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值