在第二课中我们初步认识了列表、元祖和字典。这节课我们来系统地深入学习一下。
一.Python序列简介
通俗地讲,序列就是一块用来存放多个值的连续内存空间。
Python中常用的序列有“列表”、“元组”、“字典”、“字符串”、“集合”等等。
除了字典和集合属于无序序列之外,列表、元组、字符串等序列都支持双向索引。
注意,序列的第一个元素下标都是“0”。(和C语言中数组一样)
还有,就是Python竟然可以用“负数”作为序列下标!最后一个元素下标为-1,倒数第二个为-2,以此类推。
二.[列表]
1.Python的列表可以存放不同数据类型的数据,非常自由。
(列表可以直接用下标访问元素)
2.当列表删除或添加元素时,列表会自动扩展或收缩内存,始终保证列表元素所占的内存空间是连续的。
3.列表常用内置函数:
4.列表元素的加入:
①直接用“+”运算符:[x]+[y]两个链表无缝连接。
②x.append(k)方法:在列表最后加一个元素k。
③x.insert(index,obj)方法:在index位置插入obj元素。此时index号元素是插入的obj,其原位置上的数全部往后移一位,index号之前的元素不移动。
④x.extend([y])方法:将列表y无缝衔接到列表x的尾部。
(注:x,y的地址均不变,属于原地操作)
5.列表元素的删除:
①deal x[k]方法:直接删除指定x[k]元素。
②x.pop(k)方法:删除指定k位置上的元素,并且可以返回这个弹出的元素。
③x.remove(m)方法:删除首次出现指定元素值m的元素。
6.列表排序:
①x.sort()方法:直接将列表元素“升序排列”。
另外:x.sorted()方法:返回升序排列的列表,不改变原列表。
②x.reverse()方法:直接将列表元素“降序排列”。
另外:x.reverse()方法:返回降序排列的列表
7.其他操作:
①for循环遍历列表:
x=[1,2,3,4,5,6,7]
for i in range(0,len(x),1): #循环语句遍历列表
print(x[i])
②复合列表全展开:x=[num for elem in x for num in elem]
x=[(1,2,3),[4,5,6],{7:'a',8:'b',9:'c'},"lwcsb"]
x=[num for elem in x for num in elem]
print(x)
※补充:切片操作
切片操作适用于列表,元素,字符串等。
切片的意思是从序列中切出一部分出来,进行一些操作。
切片操作的语法:x[a : b : c]。【由三个数字和两个冒号组成】
a代表切片开始位置(算入),不写默认从0开始;
b代表切片结束位置(不算入),不写默认为表尾;
c代表步长,不写默认为1。
切片内可以简写:
比如x[::2]就是从头到尾以步长为2切片。
比如x[:3]就是从头以步长1一直切到3号元素。
再比如x[3:7]就是从3号以步长1切到7号。
(但是保险起见,增加可读性,还是写全吧~~)
灵活运用切片可以完成一些比较好的操作:
①把整个序列倒着输出一遍:x[::-1]
x=[1,2,3,4,5,6,7]
print(x[::-1])
②append方法在中间插入:(不太推荐,没啥意思,纯整活)
x=[1,2,3,4,5,6,7]
x[3:4]=[x[3],9]
print(x)
③原地修改列表,原地改动列表:
x=[1,2,3,4,5,6,7]
x[:3]=[8,8,8] #切出[1,2,3],暂时调用并修改成[8,8,8]
print(x)
x=[1,2,3,4,5,6,7]
x[len(x):]=[8] #从表尾开始切(其实就是没切),在最后填上[8],相当于append
print(x)
x=[1,2,3,4,5,6,7]
del x[:3] #切出[1,2,3],删除之
print(x)
三.(元组)
1.元组是不可变序列:其形式是x=(1,2,3,…,n),可以存放各种数据类型的数。
元组一旦创建,用任何方法都不能改变其中元素值,也无法添加或删除元素。
2.切片适用于元组,但只能用切片访问元组的元素,不能改变。
3.元组的不可变性只适用于元组自身顶层,而非其内容。运行下面的代码,你就会知道:
x=[[1,2],3,4,5]
x[0][0]=8
print(x) #打印结果是[[8,2],3,4,5]
4.列表和元组的互化:【!!!重要!!!】
list()方法可以使元组变为列表;tuple()方法可以使列表变为元组。
由于列表是可变的,元组是不可变的,所以利用这两个方法,相当于对序列内的数据进行“冻结”和“解冻”,改变序列的可改写性。
x=(1,2,3)
#x(1)=8 报错,元组是不可变序列
x=list(x) #x变为列表
x[1]=8
print(x)
x=tuple(x) #x变为元组
print(x)
四.{字:典}
1.字典是无序可变序列,由一个个“键值对”组成。所谓“键值对”,即一个关键字+一个数据域。其形式如下:
x={a:b} 其中a是键,b是值。用花括号集中多个键值对形成字典。
键a:不能是列表、集合、字典,其他数据类型均可。(元组、数字、字符串…)
2.字典的创建:
①直接赋值写出。
②运用dict( )方法复合zip( )方法对两个列表(键列表、值列表)进行打包:
keys=[1,2,3,4,5]
values=["Midway","Iowa","NorthCarolina","SouthCarolina","Alaska"]
x=dict(zip(keys,values))
print(x)
3.字典元素的获取:
①直接使用“键”索引,获取对应“值”。
②使用get( )方法,但仍然是“键”索引获取对应“值”。
x={1:'a',2:'b',3:[1,2],"4":5,5:"LWCSB"}
print(x[5])
print(x.get("4"))
【注意:get()方法不只是如此:
get(key,default):键key存在则返回相应的值,否则返回default。
这个延伸的get方法在后面会用到!】
③items( )方法遍历“键值对”。
④values( )方法遍历“值”。
⑤keys( )方法遍历“键”。
以上三种用法需要借助for循环实现:
x={1:'a',2:'b',3:[1,2],"4":5,5:"LWCSB"}
for k in x.items(): #遍历键值对
print(k)
for k in x.values(): #遍历值
print(k)
for k in x.keys(): #遍历键
print(k)
4.字典元素的添加:
①直接对指定“键”的值赋值修改。如果找不到对应键,直接在字典里添加该键值对。
c
x[1]="Kongo"
x[9]="Zao" #找不到要修改的键值对,自动添加该键值对
print(x)
②运用update( )方法:
直接将新的字典融合进原字典。如果两个字典有“键”冲突,则这个“键”对应新的字典的值。(不然怎么叫“更新”对吧~)
x={1:'a',2:'b',3:[1,2],"4":5,5:"LWCSB"}
x.update({1:'k',(6,7):"Yamato",8:"Fubuki"})
print(x)
5.字典元素的修改:
①del命令:删除指定“键”对应的元素。
②clear( )方法:清除字典中的所有元素。
③pop( )方法:删除指定键对应的元素,但只返回“值”。
④popitem( )方法:删除最后一个元素,返回键值对。(不接收参数)
x={1:'a',2:'b',3:[1,2],"4":5,5:"LWCSB"}
print(x.pop(1))
print(x.popitem())
print(x)
五.{集合}
1.集合的定义不用我多说了吧。其形式是:{1,2,3,4}
2.set( )方法:将其他可迭代对象转化为集合。(如:列表、元组)
list=[1,2,3,4,5]
x=set(list)
print(x)
y=set() #创建一个空集
print(y)
3.add( )方法:添加元素。
4.pop( )方法:弹出第一个元素。(不接收参数)
x={1,2,3,4}
x.add(5)
print(x)
x.pop()
print(x)
5.集合操作:
①交集& 并集 | 差集-
②比较集合大小:> < >= <= ==
③测试是否为子集:issubset( )方法。
x={1,2,3,4,5}
y={1,2,3,6,7}
z={1,2,3,4}
print(x&y)
print(x|y)
print(x-y)
print(x>y)
print(x<y)
print(z.issubset(x)) #测试z是否为x的子集
六.序列应用实例
1.用“字典”统计文本中不同字符出现的个数:
text=input("输入一串字符:")
x=dict() #创建一个空字典
for i in text:
x[i]=x.get(i,0)+1
#用i遍历text的每一个字符。(i即text中的每一个字符)
#x[i]表示生成或调用 键为字符‘i’的字典元素,并将要为其赋值。
#x.get(i,0)+1:首先获取字典x中键为‘i’的元素的值,如果找不到则为0。
#然后进行+1统计操作,得到的值就是当前字符i的个数,重新赋给x[i]。
print(x)
2.用列表处理大量数据:
比如这个题目↓【感谢顾同学提供的题目!】
我们想要的效果是这样的:
我们要达到的效果是对数据进行集合处理,并且排序。
这是代码:
data=input()
x=data.split("\\n")
y=[]
for i in x:
i=i.split(",")
a1=i[0] #a1代表年份(每一项的第一个)
a2=int(i[1]) #a2代表后面的数字
A=[a1,a2] #A代表嵌套列表中的每一项
y.append(A) #逐一添加A
#print(y) 检查y的正确性
z=sorted(y,key=lambda y:y[-1])
#sorted条件排序。sorted(目标列表,key=lambda 形参(代表列表中的元素):条件)
z=z[::-1] #列表反向
#print(z) 检查z的正确性
for i in range(0,len(z),1): #遍历输出
print(z[i])
"""测试数据:
2020年,87\n2019年,96\n2018年,99\n2017年,99\n2016年,76\n2015年,87\n2014年,100\n2013年,86\n2012年,63\n2011年,66\n2010年,59\n2009年,81\n2008年,63\n2007年,74\n2006年,81\n2005年,79\n2004年,59
"""
这里面要素过多,我会分一期出来讲解。(可以先看我写的注释)