@yanglt7
2018-11-14T03:25:39.000000Z
字数 2647
阅读 712
Python
取一个list或tuple的部分元素,取前N个元素,也就是索引为0-(N-1)的元素,有三种方法。
最笨的:
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']>>> [L[0], L[1], L[2]]['Michael', 'Sarah', 'Tracy']
可以用循环:
>>> r = []>>> n = 3>>> for i in range(n):... r.append(L[i])...>>> r['Michael', 'Sarah', 'Tracy']
切片:
>>> L[0:3]['Michael', 'Sarah', 'Tracy']
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。
如果第一个索引是0,还可以省略:
>>> L[:3]['Michael', 'Sarah', 'Tracy']
支持倒数切片:倒数第一个元素的索引是-1。
>>> L[-2:]['Bob', 'Jack']>>> L[-2:-1]['Bob']
创建0-99数列:
>>> L = list(range(100))>>> L[0, 1, 2, 3, ..., 99]
只写[:]就可以原样复制一个list:
>>> L[:][0, 1, 2, 3, ..., 99]
前10个数,每两个取一个:
>>> L[:10:2][0, 2, 4, 6, 8]
所有数,每5个取一个:
>>> L[::5][0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:
>>> (0, 1, 2, 3, 4, 5)[:3](0, 1, 2)
字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
>>> 'ABCDEFG'[:3]'ABC'>>> 'ABCDEFG'[::2]'ACEG'
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
在Python中,迭代是通过for ... in来完成的,Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:
>>> d = {'a': 1, 'b': 2, 'c': 3}>>> for key in d:... print(key)...acb
因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
>>> d = {'a': 1, 'b': 2, 'c': 3}>>> for value in d.values():... print(value)...acb>>> d = {'a': 1, 'b': 2, 'c': 3}>>> for k,v in d.items():... print(k,v)...acb
由于字符串也是可迭代对象,因此,也可以作用于for循环:
>>> for ch in 'ABC':... print(ch)...ABC
判断一个对象是可迭代对象,方法是通过collections模块的Iterable类型判断:
>>> from collections import Iterable>>> isinstance('abc', Iterable) # str是否可迭代True>>> isinstance([1,2,3], Iterable) # list是否可迭代True>>> isinstance(123, Iterable) # 整数是否可迭代False
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):... print(i, value)...0 A1 B2 C
上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:... print(x, y)...1 12 43 9
可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections import Iterable>>> isinstance([], Iterable)True>>> isinstance({}, Iterable)True>>> isinstance('abc', Iterable)True>>> isinstance((x for x in range(10)), Iterable)True>>> isinstance(100, Iterable)False
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator>>> isinstance((x for x in range(10)), Iterator)True>>> isinstance([], Iterator)False>>> isinstance({}, Iterator)False>>> isinstance('abc', Iterator)False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)True>>> isinstance(iter('abc'), Iterator)True