2. 列表
-
列表的特点
- 列表是内容、长度均可改变的序列
- 列表是包含多个元素的有序连续的内存空间
- 字符串是任意字符的序列,一个列表是任何元素的序列
-
列表的常用方法
-
方法 要点 描述 list.append(x) 增加元素 将元素 x 增加到列表 list 尾部 list.extend(aList) 增加元素 将列表 alist 所有元素加到列表 list 尾部 list.insert(index,x) 增加元素 在列表 list 指定位置 index 处插入元素 x list.remove(x) 删除元素 在列表 list 中删除首次出现的指定元素 x list.pop([index]) 删除元素 删除并返回列表 list 指定为止 index 处的元素,默认是 最后一个元素 list.clear() 删除所有元素 删除列表所有元素,并不是删除列表对象 list.index(x) 访问元素 返回第一个 x 的索引位置,若不存在 x 元素抛出异常 list.count(x) 计数 返回指定元素 x 在列表 list 中出现的次数 len(list) 列表长度 返回列表中包含元素的个数 list.reverse() 翻转列表 所有元素原地翻转 list.sort() 排序 所有元素原地排序 list.copy() 浅拷贝 返回列表对象的浅拷贝
-
-
列表的创建
-
[]:直接使用一个中括号就可以创建一个列表
-
>>> a = [10,20,'gaoqi','sxt'] >>> a = [] #创建一个空的列表对象
-
-
list()方法创建一个列表,list方法可以把任意可以迭代的数据转化为列表
-
>>> a = list() #创建一个空的列表对象 >>> a = list(range(10)) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a = list("gaoqi,sxt") >>> a ['g', 'a', 'o', 'q', 'i', ',', 's', 'x', 't']
-
-
range()方法:该方法可以快速的创建一个整数的序列,该返回值并不是一个列表,而是一个range对象,我们需要使用list()方法将其转化为
-
语法格式:range([start,] end [,step])
- start:可选参数,表示起始的数字,如果不写则默认从0开始
- end:必选参数,表示结尾的数字
- step:可选参数,表示步长,默认为1
-
>>> list(range(15,3,-1)) [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4] >>> list(range(3,-10,-1)) [3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
-
-
列表推导式:使用循环语句、条件判断语句生成列表
-
>>> 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]
-
-
-
列表元素的添加:
-
append()方法:在原有的列表尾部添加新元素,速度最快,推荐使用
-
>>> a = [20,40] >>> a.append(80) >>> a [20, 40, 80]
-
-
+运算符:并不是在原有的列表尾部添加元素而是创建了一个新的列表,再将原有的列表元素和新添加的元素复制到新的列表中去。
-
>>> a = [20,40] >>> id(a) 46016072 >>> a = a+[50] >>> id(a) 46015432
-
-
extend()方法:将 目标列表中的所有元素添加到本列表的尾部,属于原地操作。
-
>>> a = [20,40] >>> id(a) 46016072 >>> a.extend([50,60]) >>> id(a) 46016072
-
-
insert()方法:可以将指定的元素插入列表中指定的位置,该方法会影响操作的速度,尽量避免使用。
-
>>> a = [10,20,30] >>> a.insert(2,100) >>> a [10, 20, 100, 30]
-
-
-
列表元素的删除
-
del删除:可以删除列表中指定位置的指定元素,该方法会影响操作的速度
-
>>> a = [100,200,888,300,400] >>> del a[1] >>> a [100,200,300,400]
-
-
pop()方法:可以删除并返回指定位置的元素,如果未指定位置则默认操作列表最后一个元素。
-
>>> a = [10,20,30,40,50] >>> a.pop() 50 >>> a [10, 20, 30, 40] >>> a.pop(1) 20 >>> a [10, 30, 40]
-
-
remove()方法:删除首次出现的指定元素,若不存在则抛出异常
-
>>> a = [10,20,30,40,50,20,30,20,30] >>> a.remove(20) >>> a [10, 30, 40, 50, 20, 30, 20, 30] >>> a.remove(100) Traceback (most recent call last): File "<pyshell#208>", line 1, in <module> a.remove(100) ValueError: list.remove(x): x not in list
-
-
-
列表元素的访问查询
-
通过索引访问元素:索引的区间在[0, 列表长度-1]这个范围。超过这个范围则 会抛出异常。
-
>>> a = [10,20,30,40,50,20,30,20,30] >>> a[2] 30 >>> a[10] Traceback (most recent call last): File "<pyshell#211>", line 1, in <module> a[10] IndexError: list index out of range
-
-
index()方法获得指定元素在列表中首次出现的索引:
- index(value,[start,[end]]):
- value为必选参数
- start和end指定了搜索的范围
- index(value,[start,[end]]):
-
count()获得指定元素在列表中出现的次数
-
count()返回指定元素在列表中出现的次数
-
>>> a = [10,20,30,40,50,20,30,20,30] >>> a.count(20) 3
-
-
成员资格判断
-
in或者not in
-
>>> a = [10,20,30,40,50,20,30,20,30] >>> 20 in a True >>> 100 not in a True >>> 30 not in a False
-
-
-
列表元素的切片操作
-
切片操作的格式与字符串的格式一致:[起始偏移量 start:终止偏移量 end[:步长 step]]
-
操作和说明 示例 结果 [:] 提取整个列表 [10,20,30] [:] [10,20,30] [start:]从 start 索引开始到 结尾 [10,20,30] [1:] [20,30] [:end]从头开始知道 end-1 [10,20,30] [:2] [10,20] [start:end]从 start 到 end-1 [10,20,30,40] [1:3] [20,30] [start : end:step] 从 start 提取到 end-1,步长是 step [10,20,30,40,50,60,70] [1:6:2] [20, 40, 60] -
示例 说明 结果 [10,20,30,40,50,60,70] [-3:] 倒数三个 [50,60,70] 10,20,30,40,50,60,70][-5:-3] 倒数第五个到倒数 第三个(包头不包尾) [30,40] [10,20,30,40,50,60,70] [::-1] 步长为负,从右到左 反向提取 [70, 60, 50, 40, 30, 20, 10]
-
-
列表的遍历
-
for x in [1,2,3,4,5]: print(x)
-
-
列表的排序
-
在原列表中进行操作,不建立新的列表
-
>>> a = [20,10,30,40] >>> id(a) 46017416 >>> a.sort() #默认是升序排列 >>> a [10, 20, 30, 40] >>> a = [10,20,30,40] >>> a.sort(reverse=True) #降序排列 >>> a [40, 30, 20, 10] >>> import random >>> random.shuffle(a) #打乱顺序 >>> a [20, 40, 30, 10]
-
-
建立新的列表的排序,不对源列表进行任何修改
-
>>> a = [20,10,30,40] >>> id(a) 46016008 >>> a = sorted(a) #默认升序 >>> a [10, 20, 30, 40] >>> id(a) 45907848 >>> a = [20,10,30,40] >>> id(a) 45840584 >>> b = sorted(a) >>> b [10, 20, 30, 40] >>> id(a) 45840584 >>> id(b) 46016072 >>> c = sorted(a,reverse=True) #降序 >>> c [40, 30, 20, 10]
-
-
列表的其他相关内置函数
-
返回列表中的最大值和最小值
-
>>> a = [3,10,20,15,9] >>> max(a) 20 >>> min(a) 3
-
-
返回整数型列表中所有元素的和,对非数值型列表的运算会报错
-
>>> a = [3,10,20,15,9] >>> sum(a) 57
-
-
-
-
二维数组:由于列表是可以存储所有数据类型元素的一个集合那么列表也可以存储列表元素
-
二维数组的遍历:
-
a = [ ["高小一",18,30000,"北京"], ["高小二",19,20000,"上海"], ["高小一",20,10000,"深圳"], ] for m in range(3): for n in range(4): print(a[m][n],end="\t") print() #打印完一行,换行
-
-
3. 元组
-
元组的特点
- 元组的核心特点是:不可变序列。
- 元组的访问和处理速度比列表快。
- 与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用。
-
元组的创建
-
通过()创建元组。小括号可以省略,注意如果元组只有一个元素,则必须在后面加上逗号
- a = (10,20,30) 或者 a = 10,20,30
- a = (1,)
-
通过 tuple(可以迭代的对象)创建元组,
-
b = tuple() #创建一个空元组对象 b = tuple("abc") b = tuple(range(3)) b = tuple([2,3,4]
-
-
-
元组的元素访问和计数
-
元组的访问与列表的访问方式一样,只不过返回的仍然是元组对象
-
>>> a = (20,10,30,9,8) >>> a[1] 10 >>> a[1:3] (10, 30) >>> a[:4] (20, 10, 30, 9)
-
-
元组的排序
-
由于元组是不可改变的序列所以要想对元组进行排序只能使用内置函数 sorted(tupleObj),并生成新的列表对象
-
>>> a = (20,10,30,9,8) >>> sorted(a) [8, 9, 10, 20, 30]
-
-
-
zip()方法
-
将多个列表对应位置的元素组合成为元组,并返回zip对象
-
>>> a = [10,20,30] >>> b = [40,50,60] >>> c = [70,80,90] >>> d = zip(a,b,c) >>> list(d) [(10, 40, 70), (20, 50, 80), (30, 60, 90)]
-
-
-
生成器推导式创建元组
-
从形式上来看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。我们可以使用生成器对象,转化为列表或者元组。也可以使用生成器对象的next方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象。
-
>>> s = (x*2 for x in range(5)) >>> s <generator object <genexpr> at 0x0000000002BDEB48> >>> tuple(s) (0, 2, 4, 6, 8) >>> list(s) #只能访问一次元素。第二次就为空了。需要再生成一次 [] >>> s <generator object <genexpr> at 0x0000000002BDEB48> >>> tuple(s) () >>> s = (x*2 for x in range(5)) >>> s.__next__() 0 >>> s.__next__() 2 >>> s.__next__() 4
-