对list 进行切片
如列表
L = ['Adam','Lisa','Bart','Paul']
L[0:3]
['Adam','Bart']
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。
即索引0,1,2,正好是3个元素。
如果第一个索引是0,还可以省略:
L[:3]
['Adam','Bart']
切片操作还可以指定第三个参数:
L[::2]
['Adam','Bart']
第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,
也就是隔一个取一个。
把list换成tuple,切片操作完全相同,只是切片的结果也变成了tuple
倒序切片
对于list,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,试试:
L = ['Adam','Paul']
L[-2:]
['Bart','Paul']
L[:-2]
['Adam','Lisa']
L[-3:-1]
['Lisa','Bart']
L[-4:-1:2]
['Adam','Bart']
对字符串切片
字符串可以进行切片操作,只是操作结果仍是字符串。
'ABCDEFG'[:3]
'ABC'
'ABCDEFG'[-3:]
'EFG'
'ABCDEFG'[::2]
'ACEG'
什么是迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)
因为 Python 的 for循环不仅可以用在list或tuple上,还可以作用在其他任何可迭代对象上。
索引迭代
Python中,迭代永远是取出元素本身,而非元素的索引。
对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引
方法是使用enumerate() 函数:
L = ['Adam','Paul']
for index,name in enumerate(L):
print index,'_',name
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
迭代dict 的value
dict 对象有一个values() 方法,这个方法把dict 转换成一个包含所有values 的list
这样,我们迭代的就是 dict 的没一个value;
d = { 'Adam': 95,'Lisa': 85,'Bart': 59 }
print d.values()
[85,95,59]
还有一个itervalues()方法,用itervalues()方法替代values()方法,迭代效果完全一样
那这两个方法有何不同之处呢?
1.values()方法实际上把一个 dict 转换成了包含 value 的list。
2. 但是itervalues()方法不会转换,它会在迭代过程中依次从 dict 中取出 value,
所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存
迭代dict 的key 和value
dict 对象的items()方法返回的值:
d = { 'Adam': 95,'Bart': 59 }
print d.items()
[('Lisa',85),('Adam',95),('Bart',59)]
tems() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:
for key,value in d.items():
print key,':',value
Lisa : 85
Adam : 95
Bart : 59
生成列表
要生成list [1,2,3,4,5,6,7,8,9,10],我们可以用range(1,11):
range(1,11)
[1,10]
但如果要生成[1x1,2x2,3x3,...,10x10]怎么做?方法一是循环:
L = []
for x in range(1,11):
L.append(x * x)
[1,16,25,36,49,64,81,100]
[x * x for x in range(1,11)]
[1,100]
条件过滤
如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选:
[x * x for x in range(1,11) if x % 2 == 0]
[4,100]
有了 if 条件,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。
多层表达式
对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列:
[m + n for m in 'ABC' for n in '123']
['A1','A2','A3','B1','B2','B3','C1','C2','C3']
翻译成循环代码就像下面这样:
L = [] for m in 'ABC': for n in '123': L.append(m + n)