Python 切片和迭代

切片和迭代


切片


假设已有列表或元组,想从其中取部分元素,该如何操作?

一般情况下,首先想到的会是通过索引,或者通过循环语句配合条件取值。

首先说一下索引取值,Python 索引默认是从 0 开始的。假设给定列表如下:

>>> L = ['Lei', 'Allen', 'Pony', 'Jacky']

现在需要取出前面两个元素,尝试使用索引取值,也就是取索引为 0 和 1 的元素:

>>> L[0], L[1]
('Lei', 'Allen')

虽然这种方法看起来可行,但若是取值的范围大到一定的程度时,届时再用这个办法就不行。

那考虑使用循环的方式:

>>> lst = []
>>> n = 2
>>> for i in range(n):
...     lst.append(L[i])
...
>>> lst
['Lei', 'Allen']

这里使用循环的方法,只需要改动 n 的大小,就能够改变取值的范围。

上面循环的方法,虽然能够指定范围实现取值,但是相对来说也比较繁琐。Python 提供了切片(Slice)操作的概念,能简化这种操作。

还是上面的的问题,现在用切片的方法来实现:

>>> L[0:2]
['Lei', 'Allen']

上面的代码相对于循环,可以说非常简洁。L[0:2] 表示的是,从索引 0 开始取值,直到索引为 2 为止(这里不包含索引为 2)。所取的索引为 01,也就是需要取的两个元素。

这里若前面的索引是 0,可以省略:

>>> L[:2]
['Lei', 'Allen']

也可以取从索引 1 开始的两个元素值:

>>> L[1:3]
['Allen', 'Pony']

这里再说一个索引的知识,索引可以为负数。索引为 -1 的时候,表示的是最后一位元素。取负数值时,是从最后往前以 1 的跨度递减:

>>> L[-1]
'Jacky'
>>> L[-2]
'Pony'

切片也支持这种索引的操作,比如取后面两个元素:

>>> L[-2:]
['Pony', 'Jacky']

这里取到末尾,最后部分可以省略(也就是冒号后面可以不写索引值)

切片可以从取前面 n 个元素,取后面 n 个元素,同样也可以在中间取值。其实前面 L[1:3] 就是从之间取值,这里可能不太明显。

重新生成一个 0 - 59 的数字列表:

>>> L = list(range(60))
>>> L
[0, 1, 2, ..., 59]

取前面 5 个元素:

>>> L[:5]
[0, 1, 2, 3, 4]

取后面 5 个元素:

>>> L[-5:]
[55, 56, 57, 58, 59]

取 15 开始到 25 的数(不包含 25)

>>> L[15:25]
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

在前面 10 个数字中,隔 2 取一个元素:

>>> L[:10:2]
[0, 2, 4, 6, 8]

在所有的数中,隔 5 取一个元素:

>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]

还有一种情况,就是 L[:],这种表示原样复制一个列表:

>>> L[:]
[0, 1, 2, ..., 59]

tuple 和字符串都可以使用切片操作,只不过这两种类型在切片之后返回的也是原类型。比如:

>>> _tuple = (0, 1, 2, 3, 4, 5)
>>> _str = '012345'
>>> _tuple[0:2]
(0, 1)
>>> _str[:2]
'01'

这里元组进行切片操作返回的依然是元组,字符串也是,返回的依旧是字符串。

迭代


如果给定一个列表,我们用 for 循环来遍历这个列表,这种遍历就称之为迭代

在 Python 中,迭代是通过 for ... in ... 来完成的,上面的循环方法用的就是这个方式。

在 Python 中,for 与其他语言不太相同,它不仅仅能作用于元组或者列表,还可以作用于其他可迭代对象中。

在下面这篇文章中,介绍过可迭代对象的概念,可以回顾下。

Python 生成器和迭代器

比如字典 dict,它并没有索引的概念,但它是可迭代对象,同样能够使用 for 循环迭代:

>>> _dict = {'a': 1, 'b': 2, 'c': 3}
>>> for key in _dict:
...     print(key)
...
a
b
c

普通字典存储方式并不是按照顺序存储的,所以输出结果的顺序可能不一样。默认情况下,遍历字典得到的结果是键(key)。

若是需要迭代值(value),可以使用 for value in _dict.values();如果需要同时迭代键值的话,可以使用 for key, value in _dict.items()

字符串也是可迭代对象,也可以使用 for 循环:

>>> for ch in "abc":
...     print(ch)
...
a
b
c

所以使用 for 循环的话,只要作用的是可迭代对象,就能够正常运行。至于判断对象是否是可迭代对象,这个问题在上面提及的 《Python 生成器和迭代器》 的文章中已经说明了,这里就不再赘述。

for 循环在进行迭代的时候,能够输出元素值对应的索引。这里要搭配内置函数 enmuerate 。这个函数能够将可迭代对象与索引组合一个序列:

>>> for i, elem in enumerate(['a', 'b', 'c']):
...     print(i, elem)
...
0 a
1 b
2 c

以上就是关于切片和迭代的内容。


欢迎关注微信公众号《书所集录》

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值