列表的长度可变,内容可更改,可以使用方括号或list函数生成列表,
a_list=[2,3,7,None]
tup=('foo','bar','baz')
b_list=list(tup)
print(b_list)
['foo', 'bar', 'baz']
b_list[1]='peekaboo'
print(b_list)
['foo', 'peekaboo', 'baz']
list常用于实体化迭代器,
gen=range(10)
print(gen)
print(list(gen))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
添加和删除元素 可以使用append在列表末尾添加元素,
b_list.append('darf')
print(b_list)
['foo', 'peekaboo', 'baz', 'darf']
insert则可以在特定的位置插入元素,
b_list.insert(1,'red')
print(b_list)
['foo', 'red', 'peekaboo', 'baz', 'darf']
insert的逆运算为pop,
b_list.pop(2)
'peekaboo'
print(b_list)
['foo', 'red', 'baz', 'darf']
可以使用remove去除一个值,它会找到并去除第一个该值,
b_list.append('foo')
print(b_list)
['foo', 'red', 'baz', 'darf', 'foo']
b_list.remove('foo')
print(b_list)
['red', 'baz', 'darf', 'foo']
用in可以检查列表中是否包含某个值,
'darf' in b_list
True
否定in可以加一个not
'darf' not in b_list
False
串联和组合列表 与元组类似,可以使用+来串联两个列表,
[4,None,'foo']+[7,8,(2,3)]
[4, None, 'foo', 7, 8, (2, 3)]
可以使用extend对列表追加多个元素,
x=[4,None,'foo']
x.extend([7, 8, (2, 3)])
print(x)
[4, None, 'foo', 7, 8, (2, 3)]
需要注意的是,使用extend比使用加号要快。
排序 可以使用sort将一个列表原地排序(不创建新的对象)。
a=[7,2,5,1,3]
a.sort()
print(a)
[1, 2, 3, 5, 7]
sort函数有一些选项,如二级排序key,我们可以利用key进行排序,
b=['saw','small','He','foxes','six']
b.sort(key=len)
print(b)
['He', 'saw', 'six', 'small', 'foxes']
二分搜索和维护已排序好的列表 bisect模块支持二分查找,和向已排序的列表插入值。 bisect.bisect可以找到插入值后仍保证排序的位置,bisect.insort是向这个位置插入值,
import bisect
c=[1,2,2,2,3,4,7]
print(bisect.bisect(c,2))
print(bisect.bisect(c,5))
4
6
bisect.insort(c,6)
print(c)
[1, 2, 2, 2, 3, 4, 6, 7]
注意,bisect不会自行检查列表是否排序好。
切片
用切片操作可以选取序列的一部分数据,切片的基本形式是在方括号中使用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循环)之后才能创建翻转的序列。