序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。比如一个整数序列[10,20,30,40], 可以这样示意表示:
列表:用于存储任意数目、任意类型的 数据集合 。 列表是内置 可变序列 ,是包含多个元素的有序连续的内存空间,Python 的列表大小可变,根据需要随时增加或缩小。列表定义的标准语法格式: a = [10,20,30,40] 其中,10,20,30,40 这些称为:列表 a 的元素。列表中的元素可以各不相同,可以是任意类型。比如: a = [10,20,'abc',True]
a = [10,20,30,40]
a = [10,20,'abc',True]
列表对象的常用方法汇总如下,方便大家学习和查阅 【以下方法除了len()外,都无返回值,所有的操作都是直接针对目标列表内容,不会产生新的列表】 。
使用 [] 语法创建列表,例如:
[]
12345678
>>> a = [10,20,'lanting','shuxu'] # 创建的元素可以不同(元素实际存储的是地址)>>> a = [] # 创建一个空的列表对象# 修改特定元素只需要覆盖指定索引的元素即可>>> a = [10,20,'lanting','shuxu'] # 创建一个列表对象>>> a[0] = 100 # 修改第一个元素的值>>> a[100,20,'lanting','shuxu']
使用 list()可以将任何可迭代的数据转化成列表。
1234567
>>> a = list() # 创建一个空的列表对象 []>>> a = list(range(10)) # range(10) 是一个可迭代的对象,可从0到9迭代【详见下面补充部分】>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a = list("lanting,shuxu") # 迭代字符串>>> a['l', 'a', 'n', 't', 'i', 'n', 'g', ',', 's', 'h', 'u', 'x', 'u']
【补充:range()创建整数列表】 range()可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为: range([start,] end [,step]) start 参数:可选,表示起始数字。默认是 0 end 参数:必选,表示结尾数字。 step 参数:可选,表示步长,默认为 1 python3 中 range()返回的是一个 range 对象,而不是列表。我们需要通过 list()方法将其转换成列表对象。 典型示例如下:
range([start,] end [,step])
123456
>>> list(range(3,15,2)) # 从3开始到15步长为2的迭代器[3, 5, 7, 9, 11, 13]>>> list(range(15,3,-1)) # 从15开始到3的逆序步长为1的迭代器[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]>>> list(range(3,-10,-1)) # 从3开始到-10的逆序步长为1的迭代器[3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到 for 循环和 if 语句。
>>> a = [x*2 for x in range(5)] # 循环创建多个元素>>> a[0, 2, 4, 6, 8]>>> a = [x*2 for x in range(100) if x%9==0] # 通过 if 过滤元素>>> a[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要, 我们一般只在列表的尾部添加元素或删除元素 ,这会大大提高列表的操作效率。
原地修改列表对象 ,是真正的列表尾部添加新的元素,速度最快,推荐使用。
1234
>>> a = [20,40]>>> a.append(80) # 尾部追加元素80>>> a[20, 40, 80]
将原列表的元素和新列表的元素依次复制到新的列表对象中。其列表id不会变化
>>> a = [20,40]>>> a = a + [80] # 使用 + 运算符从尾部追加一个列表>>> a[20, 40, 80]>>> a.extend([10]) # 使用extend()函数从尾部追加一个列表>>> a[20, 40, 80, 10]
使用 insert()方法可以将指定的元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。
>>> a = [10,20,30]>>> a.insert(2,100) 从索引为2的位置(第三个元素)插入元素100>>> a[10, 20, 100, 30]
使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。
>>> a = ['sxt',100]>>> b = a * 3>>> a['sxt', 100]>>> b['sxt', 100, 'sxt', 100, 'sxt', 100]
适用于乘法操作的,还有:字符串、元组。例如:
1 23456
>>> c = 'sxt'>>> d = c * 3>>> c'sxt'>>> d'sxtsxtsxt'
使用del 删除列表指定位置的元素。如果不是删除最后一个元素,会导致列表的元素挪动。
>>> a = [100,200,888,300,400]>>> del a[1] # 使用del命令删除>>> a[100,200,300,400]
pop()删除并返回 指定位置 元素,如果未指定位置则默认操作列表最后一个元素。
123456789
>>> a = [10,20,30,40,50]>>> a.pop() # 删除并返回最后一个元素50>>> a[10, 20, 30, 40]>>> a.pop(1) # 删除并返回索引为1的元素20>>> a[10, 30, 40]
删除首次出现的 指定元素 , 若不存在该元素抛出异常 。【与pop()方法不同在于,remove()删除的是指定的元素,而pop()删除的是指定索引的元素】
>>> a = [10,20,30,40,50,20,30,20,30]>>> a.remove(20) # 删除a列表中第一次出现的20>>> a[10, 30, 40, 50, 20, 30, 20, 30]
我们可以通过索引直接访问元素。索引的区间在[0, 列表长度-1]这个范围。超过这个范围则会抛出异常。
123
>>> a = [10,20,30,40,50,20,30,20,30]>>> a[2] # 直接通过索引号获取30
index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,start 和 end 指定了搜索的范围。
>>> a = [10,20,30,40,50,20,30,20,30]>>> a.index(20) # 查找20在列表中第一次出现的索引1 >>> a.index(20,3) #从索引位置 3 开始往后搜索的第一个 205 >>> a.index(30,5,7) #从索引位置 5 到 7 这个区间,第一次出现 30 元素的位置6
count()可以返回指定元素在列表中出现的次数。因此可以使用count()函数来判断某个元素是否在列表中,count()统计结果为0表示不存在,否则为存在
>>> a = [10,20,30,40,50,20,30,20,30]>>> a.count(20) # 统计20在列表中出现的次数3
列表可以使用切片语法给列表批量赋值。
>>> name = list("lanting")>>> name[2:] = list("shuxu") # 将从第三个开始到最后的列表内容修改为新列表>>> name['l', 'a', 's', 'h', 'u', 'x', 'u']
切片赋值可以是与原列表不同长度的列表。
>>> name = list("he")>>> name[1:] = list("hello world") #将一个更长的元组赋值到列表中>>> name # 我们可以看到赋值后列表被扩宽了['h', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
切片还可以在不替换原有元素的情况下 插入新元素
>>> number = [1,5]>>> number[1:1] = [2,3,4] # 在1后面的空切片中插入一个列表>>> number[1, 2, 3, 4, 5]
上面代码中,我们“替换”了一个空的切片,也就 相当于插入了一个新元素 ,当然,也可以利用类似的措施来删除元素。
12345
>>> number[1, 2, 3, 4, 5]>>> number[1:4] = [] # 将某个切片范围设置为空列表,也就相当于删除了目标列表>>> number[1, 5]
上述代码与 del nubmer[1:4] 等效
del nubmer[1:4]
与列表一样,元组也是序列,与元组的区别在于:元组是 不能被修改 的,元组的创建语法非常简单,只需要将一些值用逗号分隔,就自动创建一个元组。
>>> 1,2,3 # 使用逗号分隔,自动创建一个元组。(1, 2, 3)>>> (1, 2, 3) # 当然也可以用()括起来,一般这是我们创建的方式(1, 2, 3)
特别地,创建元素只有一个的元组时,需要做点特殊处理。
>>> 42 # 当元组只有一个时,这样的创建方式会被识别为一个字面量42>>> 42, # 当只有一个元素时,我们需要额外在末尾增加一个逗号(42,)>>> (42,) # 括号中也是如此(42,)
创建一个元素的时候不管是不是包含(),都应该在元素后面增加一个逗号。
>>> 3 * (40 +2 ) # 如果没有逗号,就被识别为算数运算符126>>> 3 * (40+2,) # 使用逗号将不再把括号中的表达式认为成算数运算(42, 42, 42)
函数tuple()的工作原理与list很像,它将一个序列作为参数,并将其转换为元组,如果参数已经是元组,就原封不动地返回它。
>>> tuple([1,2,3])(1, 2, 3)>>> tuple("abc")('a', 'b', 'c')>>> tuple((1,2,3))(1, 2, 3)
元组的切片操作,单个元素访问都与列表相同,只是元组不能修改内容而已。
>>> x = 1,2,3 # 创建一个元组>>> x[1] # 取得第2个元素2>>> x[0:2] # 切片操作