假设已有列表或元组,想从其中取部分元素,该如何操做?python
通常状况下,首先想到的会是经过索引,或者经过循环语句配合条件取值。微信
首先说一下索引取值,Python 索引默认是从 0 开始的。假设给定列表以下:app
>>> L = ['Lei', 'Allen', 'Pony', 'Jacky']
如今须要取出前面两个元素,尝试使用索引取值,也就是取索引为 0 和 1 的元素:函数
>>> L[0], L[1] ('Lei', 'Allen')
虽然这种方法看起来可行,但如果取值的范围大到必定的程度时,届时再用这个办法就不行。.net
那考虑使用循环的方式:code
>>> lst = [] >>> n = 2 >>> for i in range(n): ... lst.append(L[i]) ... >>> lst ['Lei', 'Allen']
这里使用循环的方法,只须要改动 n 的大小,就可以改变取值的范围。对象
上面循环的方法,虽然可以指定范围实现取值,可是相对来讲也比较繁琐。Python 提供了切片(Slice)操做的概念,能简化这种操做。blog
仍是上面的的问题,如今用切片的方法来实现:索引
>>> L[0:2] ['Lei', 'Allen']
上面的代码相对于循环,能够说很是简洁。L[0:2]
表示的是,从索引 0 开始取值,直到索引为 2 为止(这里不包含索引为 2)。所取的索引为 0
,1
,也就是须要取的两个元素。字符串
这里若前面的索引是 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
与其余语言不太相同,它不只仅能做用于元组或者列表,还能够做用于其余可迭代对象中。
在下面这篇文章中,介绍过可迭代对象的概念,能够回顾下。
好比字典 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
以上就是关于切片和迭代的内容。
欢迎关注微信公众号《书所集录》