切片
用切片操作可以选取序列的一部分数据,切片的基本形式是在方括号中使用start:stop:
seq=[7,2,3,7,5,6,0,1]
seq[1:5]
[2, 3, 7, 5]
切片也可以被序列赋值:
seq[3:4]=[6,3]
print(seq)
[7, 2, 3, 6, 3, 5, 6, 0, 1]
切片操作是“包头不包尾”。start或stop都可以被省略,省略之后,默认为序列的开头和结尾,
seq[:5]
[7, 2, 3, 6, 3]
seq[3:]
[6, 3, 5, 6, 0, 1]
负数表明从后向前切片:
seq[-4:]
[5, 6, 0, 1]
seq[-6:-2]
[6, 3, 5, 6]
在第二个冒号后使用step,可以隔一个取一个元素,
seq[::2]
[7, 3, 3, 6, 1]
一个小技巧是,在第二个冒号后使用-1,这可以将列表或元组翻转过来
seq[::-1]
[1, 0, 6, 5, 3, 6, 3, 2, 7]
序列函数
Python有一些有用的序列函数,
enumerate函数
该函数可以返回(i,value)元祖序列,
some_list=['foo','bar','baz']
mapping={}
for i,v in enumerate(some_list):
mapping[v]=i
print(mapping)
{'foo': 0, 'bar': 1, 'baz': 2}
sorted函数
sorted函数可以从任意序列的元素返回一个新的排好序的列表,
sorted([7,1,2,6,0,3,2])
[0, 1, 2, 2, 3, 6, 7]
sorted('horse race')
[' ', 'a', 'c', 'e', 'e', 'h', 'o', 'r', 'r', 's']
zip函数
zip可以将多个列表、元组或其它序列成对组合成一个元组列表,
seq1=['foo','bar','baz']
seq2=['one','two','three']
zipped=zip(seq1,seq2)
list(zipped)
[('foo', 'one'), ('bar', 'two'), ('baz', 'three')]
zip可以处理任意多的序列,元素的个数取决于最短的序列,
seq3=[False,True]
list(zip(seq1,seq2,seq3))
[('foo', 'one', False), ('bar', 'two', True)]
zip的常见用法是同时迭代多个序列,可以结合enumerate使用,
for i,(a,b) in enumerate(zip(seq1,seq2)):
print('{0}:{1},{2}'.format(i,a,b))
0:foo,one
1:bar,two
2:baz,three
给出一个“被压缩的”序列,zip可以被用来解压序列。也可以当作把行的列表转换为列的列表。
pitchers=[('Nolan','Ryan'),('Roger','Clements'),('Schilling','Curt')]
first_names,last_names=zip(*pitchers)
print(first_names)
print(last_names)
('Nolan', 'Roger', 'Schilling')
('Ryan', 'Clements', 'Curt')
reversed函数
reversed可以从后向前迭代一个序列,
list(reversed(range(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
list_10=list(range(10))
print(list_10[::-1])
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
需要注意的是,reversed是一个生成器,只有实体化(即列表或for循环)之后才能创建翻转的序列。