切片操作
切片返回的是列表元素的浅复制。所谓浅复制,是指生成一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型的数据,一般是没有问题的。
如果原列表中包含列表之类的可变数据类型,由于浅复制时只是把子列表的引用复制到新列表中,这样的话修改任何一个都会影响另外一个。
alist[start:stop:step] #start表示开始元素位置(默认0) stop表示终止元素位置(默认列表长度) step表示布长(默认1)
列表排序与逆序
import random
random.shuffle(alist) #随机打乱顺序
alist.sort() #默认升序
alist.sort(reverse=True) #降序排列
用于序列操作的常用内置函数
len(列表):返回列表中的元素个数,同样适用于元组、字典、集合、字符串等。
max(列表)、 min(列表):返回列表中的最大或最小元素,同样适用于元组、字典、集合、range对象等。
sum(列表):对列表的元素进行求和运算,对非数值型列表运算需要指定start参数,同样适用于元组、range。
sum(range(1, 11)) #sum()函数的start参数默认为0
55
sum(range(1, 11), 5) #指定start参数为5,等价于5+sum(range(1,11))
60
sum([[1, 2], [3], [4]], []) #这个操作占用空间较大,慎用
[1, 2, 3, 4]
zip()函数用来把多个可迭代对象中的元素压缩到一起,返回一个可迭代的zip对象,其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组,如同拉拉链一样。
list(zip('abcd', [1, 2, 3])) #压缩字符串和列表
[('a', 1), ('b', 2), ('c', 3)]
list(zip('123', 'abc', ',.!')) #压缩3个序列
[('1', 'a', ','), ('2', 'b', '.'), ('3', 'c', '!')]
x = zip('abcd', '1234')
list(x)
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]
enumerate(列表):枚举列表元素,返回枚举对象,其中每个元素为包含下标和值的元组。该函数对元组、字符串同样有效。
for item in enumerate('abcdef'):
print(item)
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')
内置函数map() 把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果,map对象中每个元素是原序列中元素经过函数func处理后的结果。
list(map(str, range(5))) #把列表中元素转换为字符串
['0', '1', '2', '3', '4']
def add5(v): #单参数函数
return v+5
list(map(add5, range(10)))#把单参数函数映射到一个序列的所有元素
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
def add(x, y): #可以接收2个参数的函数
return x+y
list(map(add, range(5), range(5,10)))
#把双参数函数映射到两个序列上
[5, 7, 9, 11, 13]
内置函数filter() 将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的filter对象,如果指定函数为None,则返回序列中等价于True的元素。
seq = ['foo', 'x41', '?!', '***']
def func(x):
return x.isalnum() #测试是否为字母或数字
filter(func, seq) #返回filter对象
<filter object at 0x000000000305D898>
list(filter(func, seq)) #把filter对象转换为列表
['foo', 'x41']
list(filter(str.isalnum, seq)) #等价的用法
['foo', 'x41']