【2】数据结构之列表、列表函数

切片
用切片操作可以选取序列的一部分数据,切片的基本形式是在方括号中使用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循环)之后才能创建翻转的序列。

上一篇:VMware虚拟机配置静态IP


下一篇:计算变量长度