python数据类型之列表(二)
1.python 列表说明
python的列表是一种有序且可变的序列,列表使用中括号[]进行定义,各项元素之间使用逗号分隔。python的列表与其他编程语言中的数组很像,但独特之处在于python并不要求列表中的元素必须都是同一个类型,而是可以存储任意类型的数据。
列表和字符串都是序列,同样支持索引方式访问,也支持切片操作,不同于字符串的是列表可以修改列表的内容。
在定义列表时,不需要指定列表的长度,也不用担心持续向列表中写入新的数据会达到存储容量限制,python列表是动态扩容。
列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。
2.创建列表
创建空列表有两种方式:
1)使用[ ]创建空列表
2)使用内置函数创建空列表
#coding=utf-8 #列表的定义 list1=[]; #使用[ ]创建空列表 list2=list(); #使用内置函数创建空列表 print(list1,list2,type(list1),type(list2),len(list1),len(list2))
结果运行:
[] [] <class 'list'> <class 'list'> 0 0
2.1 使用[ ]创建列表
2.1.1 使用[ ] 创建列表
#coding=utf-8; # 创建一个空列表 empty_list=[]; # 打印创建的空列表 print empty_list; #向空列表添加元素 empty_list.append(1); empty_list.append("aa"); empty_list.append('#'); #打印列表 print empty_list; #创建一个有多元素的列表 lst = [1,"2",'3',True,["a","b"]]; print lst;
运行结果:
[] [1, 'aa', '#'] [1, '2', '3', True, ['a', 'b']]
空列表的长度是0,此后你可以使用append方法向列表添加元组。列表对存储在其中的元素类型没有要求,因此,你可以将任意类的元素存储在列表中,甚至包括列表本身,后面将要学习的元组,字典,集合,同样可以存在列表中。
2.1.2 使用内置函数创建列表
#使用内置函数创建列表 lst1 = list("python"); lst2 = list([1,2,3]); print lst1; print lst2;
运行结果:
['p', 'y', 't', 'h', 'o', 'n'] [1, 2, 3]
能够作为list参数的不只是字符串和列表,任何可迭代对象都可以作为list函数的参数,list会返回一个新的列表。
3.访问列表里的元素。
访问列表里的元素只能使用索引方式,它的一般代码形式如下:
list[index]或
list[start-index:end-index]
在列表对象后面紧跟一对中括号[],中括号里的index是索引值,索引从0开始,正向索引逐个递增,列表的最大索引值是列表的长度减去1。python列表的索引支持反向索引,最后一个元素的索引值是-1,反向递减。以上面的列表为例。
4.向列表里新增数据
向一个列表新增数据,有三个常用的方法,他们有各自的应用场景,这三个方法分别是:
- append:在列表的末尾新增数据。
- insert:在指定的索引位置的前面向列表中插入一个新的元素,指定的插入索引位置是多少,新元素的索引就是多少。
- extend:append和inset一次只能新增一个元素,extend方法可以一次性将另一个序列里的元素追加到列表的末尾。
4.1 append 方法在列表的末尾新增数据。
#coding=utf-8 lst=[1,2,3]; print lst; lst.append(4); lst.append(5); print lst;
运行结果:
[1, 2, 3]
[1, 2, 3, 4, 5]
新增的数据一定会成为列表的最后一个元素。
4.2 insert方法在指定的索引位置的前面向列表中插入一个新的元素,指定的插入索引位置是多少,新元素的索引就是多少。
#insert方法在指定的索引位置的前面向列表中插入一个新的元素,指定的插入索引位置是多少,新元素的索引就是多少。 insertlst=[1,3,5,7,9]; insertlst.insert(1,2) print insertlst; #向0索引添加0 insertlst.insert(0,0); print insertlst; #由于insert只能在指定索引的前面插入,因此你无法使用insert方法在列表的末尾插入新的元素 insertlst.insert(-1,"end"); print insertlst;
运行结果:
[1, 2, 3, 5, 7, 9] [0, 1, 2, 3, 5, 7, 9] [0, 1, 2, 3, 5, 7, 'end', 9]
我使用insert方法在索引0的前面插入新元素0,插入后,0的索引就是0。由于insert只能在指定索引的前面插入,因此你无法使用insert方法在列表的末尾插入新的元素,列表的最大索引是7,如果insert指定插入索引位置为7,那么新插入元素的索引就会是7,而原本在索引7的位置上的元素将被移动到索引8的位置上。
4.3 append和inset一次只能新增一个元素,extend方法可以一次性将另一个序列里的元素追加到列表的末尾。
#extend方法可以一次性将另一个序列里的元素追加到列表的末尾 lste1=[1,2,3]; lste2=["a","b","c"]; lste2.extend(lste1); print lste2;
运行结果:
['a', 'b', 'c', 1, 2, 3]
4.4 列表添加元素方法练习
#coding=utf-8 #列表的定义 list1=[]; #使用[ ]创建列表 list2=list(); #使用内置函数创建列表 print(list1,list2,type(list1),type(list2),len(list1),len(list2)) #列表的新增 list2=[] #在列表的末尾新增数据 list1.append(1); list1.append(2) list1.append("A") list1.append("B") print(list1.append(1),list1) #在指定的索引位置的前面向列表中插入一个新的元素,指定的插入索引位置是多少,新元素的索引就是多少。 list2.insert(0,22) list2.insert(1,44) list2.insert(2,"AA") list2.insert(3,"BB") print(list2.insert(0,22),list2) #append和inset一次只能新增一个元素,extend方法可以一次性将另一个序列里的元素追加到列表的末尾。 list3=list1.extend(list2) print(list1,list3,list1.extend(list2)) #append()、extend()和insert()只是修改列表,这三个方法没有返回值,所以不能用于赋值,赋值只能得到none
运行结果:
[] [] <class 'list'> <class 'list'> 0 0 None [1, 2, 'A', 'B', 1] None [22, 22, 44, 'AA', 'BB'] [1, 2, 'A', 'B', 1, 22, 22, 44, 'AA', 'BB', 22, 22, 44, 'AA', 'BB'] None None
5.修改列表里的数据
修改列表里的某一项元素,需要通过索引方式找到元素然后重新对其赋值。
#coding-utf-8 lst=[1,2,3,"abc","12a",[12,"ai","bi",[1,2,"k"]],7,[1,2],9] print(type(lst),len(lst),lst) lst[0]="第一索引0"; print(lst) lst[5][3][0]=61; print(lst) lst[7][0]=8 print(lst)
运行结果:
<class 'list'> 9 [1, 2, 3, 'abc', '12a', [12, 'ai', 'bi', [1, 2, 'k']], 7, [1, 2], 9] ['第一索引0', 2, 3, 'abc', '12a', [12, 'ai', 'bi', [1, 2, 'k']], 7, [1, 2], 9] ['第一索引0', 2, 3, 'abc', '12a', [12, 'ai', 'bi', [61, 2, 'k']], 7, [1, 2], 9] ['第一索引0', 2, 3, 'abc', '12a', [12, 'ai', 'bi', [61, 2, 'k']], 7, [8, 2], 9]
6.删除列表里的数据
删除列表中的数据,有4种方法,分别是:
- remove :指明要删除的元素值,删除符合条件的第一个值
- pop :指明要删除元素的索引
- del :指明要删除元素的索引
- clear :清空列表,删除所有元素
6.1 使用remove方法删除列表里的元素需要在方法里指明要删除的元素的值。
#coding=utf-8 lst1=[1,2,3,2,5,2]; lst1.remove(2); print lst1;
运行结果:
[1, 3, 2, 5, 2]
虽然指明要删除2,但是remove方法不会将列表里所有的值为2的元素删除,它只会删除能够找到的第一个符合删除条件的值,剩余的值即便符合删除条件也不会被删除。
同时需要注意的是,如果指定要删除的元素不存在,会引发ValueError异常,因此在使用remove方法之前,务必先使用成员运算符in 或者是其他方法先确定被删除的元素是否真的在列表中。
6.2 使用pop方法删除列表里的元素时需要在方法里指明要删除的元素的索引。
#使用pop方法删除列表里的元素时需要在方法里指明要删除的元素的索引 lst2 =[2,4,6,8,10]; lst2.pop(2); print lst2;
运行结果:
[2, 4, 8, 10]
6.3 使用del关键字也可以删除指定索引位置的元素。
#使用del关键字也可以删除指定索引位置的元素 lst3 =[1,3,5,7,9]; del lst3[1]; print lst3;
运行结果:
[1, 5, 7, 9]
6.4 clear方法清空列表,删除所有元素
lst = [1, 2, 3, 2] lst.clear() print(lst) # []
clear方法情况列表后,lst变为一个空列表。
lsit 删除综合练习:
#coding=utf-8 lst1=[1,2,3] lst3=["abc",1,1,2,1] lst4=[1,2,3,4,5] #remove 指明列表的值删除,删除符合条件的第一个值 print(lst3) lst3.remove(1); print(lst3) #pop 指明列表的索引值进行删除 print("pop--->",lst1) lst1.pop(0) print("pop--->",lst1) #del 指明列表的索引值进行删除 print("del----->>",lst1) del lst1[1] print("del----->>",lst1) print(lst4) lst4.clear(); print(lst4)
运行结果:
['abc', 1, 1, 2, 1] ['abc', 1, 2, 1] pop---> [1, 2, 3] pop---> [2, 3] del----->> [2, 3] del----->> [2] [1, 2, 3, 4, 5] []
7. 遍历列表
#coding=utf-8; lst=[1,2,3]; #列表for循环遍历 for item in lst: print item
运行结果:
1 2 3
8.列表的一些常见操作
8.1 使用内置函数len获取列表的长度
lst1=[1,2,3,4,5] #1.获取列表的长度 print len(lst1); #输出5
知晓列表的长度,就能够计算出列表的索引范围,列表的最小索引是0,最大索引是起长度值减1,这在通过索引方式遍历列表时是非常有用的。
lst = [1, 2, 3, 2] for i in range(len(lst)): print(lst[i])
8.2 使用算数运算符+合并两个列表。
lst1=[1,2,3,4,5]; lst2=["a","b","c"]; #2.使用算数运算符+合并两个列表 print lst1+lst2;
运行结果:
[1, 2, 3, 4, 5, 'a', 'b', 'c']
python的序列,例如字符串,列表,元组,都支持算数运算符+
8.3 使用*复制列表,使用 in,not in 判断元素是否在列表里。
#.使用* 复制列表 lst3 =[1,2,"a","c"]; print lst3*3; #.使用in ont in 判断元素是否在列表里 lst4=[1,2,3,4,5]; print 8 in lst4,1 in lst4,2 not in lst4,9 not in lst4;
运行结果:
[1, 2, 'a', 'c', 1, 2, 'a', 'c', 1, 2, 'a', 'c'] False True False True
9.列表的常用方法
方法 | 功能 |
---|---|
count() | 统计某个元素在列表中出现的次数 |
append() | 在列表末尾添加新的对象 |
extend | 在列表末尾一次性追加另一个序列中的多个值 |
index | 返回一个元素在列表中第一次出现的位置索引 |
insert() | 将对象插入列表中的指定位置 |
pop() | 删除列表中指定索引的元素,默认删除最后一个并返回该值 |
remove() | 移除列表中某个值的第一个匹配项 |
reverse() | 翻转列表 |
sort() | 对列表进行排序 |
9.1 实例
#coding=utf-8 lst1=[1,5,4,3,2,1,8,7,1,9] lst=["a","b","c"] #count 统一某个元素出现的次数 print(lst1.count(1)) #index 列表名.index(查找的值)返回一个元素在列表中,第一次出现的位置索引 print(lst1.index(1)) #index 列表名.index(查找的值,开始查找的范围索引,结束查找的范围索引) print(lst1.index(1,1,6)) #reverse() 翻转 lst1.reverse() #函数不返回值,访问lst1 print(lst1.reverse()) print(lst1); #sort lst1.sort() print(lst1)
运行结果:
3 0 5 None [1, 5, 4, 3, 2, 1, 8, 7, 1, 9] [1, 1, 1, 2, 3, 4, 5, 7, 8, 9]
2.列表实例1
3.列表实例2
# coding=utf-8; #列表 list1 = [2,4,6,8,10,[3,5,7,9],888]; list2 = ['A','B','C',22,['e','f','g','h','i'],11,22]; list3 = [25,50,35,20,5,30]; list4 = [2,4]; list5 = [2,4]; #list1 增 append() list1.append(999); print "新增append:"+str(list1); #list1 删除del del list1[5]; print list1; #list1 插入insert list1.insert(2,5); print list1; #list1 替换 print "str(list1):"+str(list1); list1 [0] = 777; print "替换:"+str(list1); #list1 批量替换 list1 [:3]=[111,222,333]; print "批量替换 list1 [:3]=[111,222,333]:"+str(list1); #列表截取 print "列表截取:"+str(list1[:3]); print list2[-3:-1]; print list2[:]; # 列表组合 print "列表组合:"+str(list1+list2); #列表重复 print "列表重复:"+str(list1 * 3); #获取列表的长度 print "获取列表的长度:"+str(len(list1)); #列表迭代 for i in list1:print "list1-迭代:"+str(i); #比较两个列表的元素 print "比较两个列表:"+ str(cmp(list4,list5)); #统计某个元素出现的次数 print "统计某个元素出现的次数:"+str(list2.count(22)) # 排序 list3.sort(); print "对列表进行排序:"+str(list3);
运行结果:
C:\Users\m\PycharmProjects\***\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2022.1.4\plugins\python-ce\helpers\pydev\pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 55744 --file C:/Users/m/PycharmProjects/***/venv/mylist.py Connected to pydev debugger (build 221.6008.17) 新增append:[2, 4, 6, 8, 10, [3, 5, 7, 9], 888, 999] [2, 4, 6, 8, 10, 888, 999] [2, 4, 5, 6, 8, 10, 888, 999] str(list1):[2, 4, 5, 6, 8, 10, 888, 999] 替换:[777, 4, 5, 6, 8, 10, 888, 999] 批量替换 list1 [:3]=[111,222,333]:[111, 222, 333, 6, 8, 10, 888, 999] 列表截取:[111, 222, 333] [['e', 'f', 'g', 'h', 'i'], 11] ['A', 'B', 'C', 22, ['e', 'f', 'g', 'h', 'i'], 11, 22] 列表组合:[111, 222, 333, 6, 8, 10, 888, 999, 'A', 'B', 'C', 22, ['e', 'f', 'g', 'h', 'i'], 11, 22] 列表重复:[111, 222, 333, 6, 8, 10, 888, 999, 111, 222, 333, 6, 8, 10, 888, 999, 111, 222, 333, 6, 8, 10, 888, 999] 获取列表的长度:8 list1-迭代:111 list1-迭代:222 list1-迭代:333 list1-迭代:6 list1-迭代:8 list1-迭代:10 list1-迭代:888 list1-迭代:999 比较两个列表:0 统计某个元素出现的次数:2 对列表进行排序:[5, 20, 25, 30, 35, 50] Process finished with exit code 0