草帽路飞UU 发表于 2022-9-7 16:31:37

老司机带你了解Python中的数据结构

3.1Python中的索引和切片
3.1.1Python中的索引
◆索引:我们可以直接使用索引来访问序列中的元素,同时索引可分为正向和负向两种,而切片也会用到索引。支持字符串(String)、列表(List)、元组(Tuple)【不可变】,但不支持集合和字典【可变】。
◆序列:包括字符串(String)、列表(List)、元组(Tuple)、集合和字典。
下面放上一个图,有助于大家理解正、负向索引的区别,如图所示:

Ø正向索引取值,例:
str='python'print(str)#输出p   print(str)#输出h
print(str)#报错,索引越界string index out of range
Ø负向索引取值,例:
str='python'print(str[-1])#输出n
3.1.2Python中的切片
◆切片:指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。
◆切片的语法:
Østart_index表示起始索引,即索引开始的位置   
Øend_index表示结束索引,即结束索引的步长。
Østep表示步长,即表示选取间隔。步长不能为0,且默认值为1
★注意:切片操作是指按照步长,截取从起始索引到结束索引,但不包含结束索引(也就是结束索引减1)的所有元素。
Python中的切片实例 :   str='python'
Øprint(str)#从索引0开始到第三位结束,不包含第三位,即0,1,2位      print(str)       print(str)
Øprint (str[:-1])#不设起始索引,默认从0位开始   
★切片反转:str='python'   print(str[::-1])#输出nohtyp
Øprint (str)#不设结束索引,默认取到末尾   
Øprint (str)#输出yo
Øprint(str[-1:-5])#步长为正则从左往右取值,结果为空
print(str[-5:-1])#输出ytho   
Øprint(str[-1:-5:-1])#从右往左确定数位,步长为负则从右往左取值#输出noht
Øprint(str)#输出typprint(str[:2:-1])#noh   
Øprint(str[::-1])#输出nohtyp   print(str[::1])#输出python
print(str[::-2])#输出结果为nhy
print(str[::2])#输出结果为pto
反转输出面试题常遇:
print(str[-2:-5:-1])#输出结果为oht
print(str[-5:-1:-1])#输出结果为空
3.2Python中的字符串
3.2.1字符串
Ø字符:指类字形单位或符号,包括字母、数字、运算符号、标点符号和功能性符号以及其它字符,通常由8个二进制位(一个字节)表示一个字符。
Ø字符串:常用‘str’表示,由一连串字符组成。是Python中最常用的数据类型,用单引号''或者双引号""来创建字符串。
例:str1 = 'hello Kitty'   str2 = "hello Kitty"
3.2.2字符串常用函数
字符串常用函数定义:表示每个输入值对应唯一输出值的一种对应关系。
◆Øcapitalize():使字符串首字母大写
str1='hello_are_you_ok'    print (str.capitalize())
Øtitle():使字符串首字母大写
str1='hello_are_you_ok'      print(str1.title())
★区别:capitalize只有整个字符串的第一个字母大写,title作用于整个字符串内的单词的首字母大写。
◆lower():将字符串中所有字母转换为小写字母输出
str='ADFASDF'print (str.lower())#输出adfasdf
◆upper():将字符串中的所有字符转换为大写字母输出
str='AsWRsdfsdfDSF'print (str.upper())#输出ASWRSDFSDFDSF
◆count():统计具体字符出现的次数
str = 'abcad'       print (str.count('a'))
◆join():把集合中的字符按自定义的分隔符连接在一起
   str ="abcad"      print ('-'.join(str))#输出a-b-c-a-d
◆split():把字符串通过指定的标识符进行分割
    str ="abcad"   print (str.split('b'))#指定分隔符存在时,去掉分隔符,剩下元素保留并转化为一个列表。如['a', 'cad']
print (str.split('*'))#指定分隔符不存在时,所有元素转化成一个列表。如:['abcad']
Ø例:把hello_python转化为HelloPython.
方法1:str='helo_python'       方法2:s='helo_python'
st=str.title()               s1=s.title().split('_')
s=st.split('_')            print(s1+s1)
print(s+s)
#输出HeloPython
◆strip(ab):删除字符串开头和结尾有a或b的字符
str ="abcad"print (str.strip('ab'))#输出cad
str ="abcad"print (str.strip('ac'))#输出bcad
str ="abcad"print (str.strip('ad'))#输出bc
◆lstrip(ab):删除字符串开头有ab序列字符
str ="abcad"print (str.lstrip('a'))
#输出bcad
◆rstrip(ab):删除字符串结尾有ab序列字符
Østr ="abcad"print (str.rstrip('d'))#输出abca
Øs="abc_abc_abc_abc"print(s.lstrip('ac'))#bc_abc_abc_abc
Øprint(s.rstrip('acb'))#输出abc_abc_abc_
◆startswith():判断字符串是否以什么开始
str ="abcad"print (str.startswith('a'))
#这里输出结果为true或false
◆endswith():判断字符串是否以什么结束
Østr ="abcad"   print (str.endswith('d'))
#这里输出结果为true或false
Ø例:nasa=input('请上传正确的文件:')
if nasa.endswith('.txt'):
    print('上传成功')
else:
    print('上传失败')
◆find()/rfind():字符串查询find()是从左边开始查,rfind()是从右边开始查,确定元素后,最终下标结果依据正向索引显示
str1 ="duoguladuo.test"    print (str1.find("o"))#输出2
print (str1.rfind("o"))#输出9 print (str1.rfind("l"))#输出5
◆replace():replace(substring,newstring,max) substring表示被替换的字符串,newstring要替换字符串,max表示替换的次数
str2='duoguladuo.test'   Øprint(str2.replace('g','t'))#duotuladuo.test
Øprint(str2.replace('g','t',2))#duotuladuo.test#替换两个前往后
Øprint(str2.replace('o','s'))#替换次数不填,默认替换全部#dusguladus.test
Øprint(str2.replace('o','s',1))#dusguladuo.test
◆isdigit():判断字符串中是否全为数字
str='abcd'   print (str.isdigit())
◆isalpha():判断字符串中是否全为字母
str='abcd'      print (str.isalpha())
◆isalnum():判断字符串当中是否全都为数字,全为字母,或者数字字母组合。返回布尔值:True和False 如果有特殊符号就是否
str='1234aa@#$'   print (str.isalnum())
◆istitle():判断字符串中首字母是否为大写,其他是否为小写,其他不为小写则为否
Østr='PyThon'    print(str.istitle())#输出False
Østr='Python'    print(str.istitle())#输出True
◆isupper()/islower():is开头的就是判断一个字符串是否展示为都是大写或者都是小写
Østr.isupper() 是否全大写      Østr.islower()是否全小写
3.3Python中的列表
3.3.1Python中的列表定义
◆列表(list):是一组有序存储的数据,也是python常见的序列之一,序列中的每个元素都分配一个索引,第一个元素索引是0,第二个元素索引是1,依此类推。序列都可以进行的操作包括索引,切片,加,乘,检查成员。
◆列表表达符号:[]          查看列表类型:print(type(表名))
◆定义列表的方法:
Ø方法一:list1 = #直接通过[]进行定义
Ø方法二:list2 = list('1234') #使用list()方法进行定义
3.3.2列表中对应的函数
◆索引和切片赋值
list1 =     list1 = 666
list1 = list('123')
Ø例(索引赋值):str='password'dj=list(str)dj='PW'   print(dj)#输出['PW', 'a', 's', 's', 'w', 'o', 'r', 'd']
Ø例(切片赋值):dj=['PW', 'a', 's', 's', 'w', 'o', 'r', 'd']
dj='MN'   print(dj)
#输出['M', 'N', 'a', 's', 's', 'w', 'o', 'r', 'd']
Ødj=['PW', 'a', 's', 's', 'w', 'o', 'r', 'd']dj=list('MN')(或dj='MN')   print(dj)#输出['PW', 'a', 'M', 'N']
◆append函数:添加一个元素
list1 =    list1.append('duoceshi')   print (list1)
◆extend函数:连接两个列表
list1=   list2 =    list1.extend(list2)
print(list1) #输出
★注意:
Øextend与append方法的相似之处在于都是将新接收到参数放置到已有列表的后面。
Øappend方法可以接收任意数据类型的参数,并且追加到list尾部;Øextend方法一般和列表还有字符串进行拼接,不能与int进行拼接。
◆insert(index,value)函数:在指定位置插入一条数据
list1 = list1.insert(0,'test') print(list1)
#输出['test', 1, 2, 3, 4]
◆remove函数:移除元素
list1 =    list1.remove(1)#输出
★注:如果列表中有多个相同的元素,会删除前面那个
◆del函数:索引删除值
list1 =       del list1 #输出
◆index函数:在列表中查找元素所对应的索引值
list1 =     print(list1.index(1))#输出0
◆sort函数:实现列表的排列
list1 =    list1.sort()   print(list1)
#输出
◆sorted函数:实现列表的降序排列
list1 =    Øprint(sorted(list1,reverse=True))#输出降序排序
Øprint(sorted(list1,reverse=False))#输出升序排序
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
★sort 与 sorted 区别:
Øsort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
Ølist 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
◆reverse函数:列表元素反转
list1 =    list1.reverse()   print(list1)
#输出
◆pop函数:
list1 = print(list1.pop(2))#输出3
Print(list1.pop())#输出4
Ø默认移除列表最后一个元素,并返回元素的值
Ø移除指定位置的元素list1.pop(0)表示移除第一个元素
Ø在列表中pop函数是唯一一个既能改变列表元素又有返回值
◆列表中文打印乱码解决方法
a =     print (str(a).decode('string_escape'))
Ødecode():指定编码格式
Ø★string-escape:编码格式,能解决因为被\转义的问题
3.4Python中的元组
3.4.1Python中的元组定义
元组(tuple):是Python中常用的一种数据结构。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字、甚至元组。元组是'写保护'的,即元组中元素作为一个整体,创建后不能再做任何修改操作。
◆元组表达符为:()
◆元组的定义:tuple1=(1,2,3)
★注意:当元组只有一个元素时,后面要加逗号,如:tuple1=(1,)
3.4.2元组中常见的操作
◆元组与列表呼出方式类似
turple1=('a','b','c','d')   print(tuple)
◆元组转换为列表
tuple1 = ('a','b','c','d')   list1=list(tuple1)
print(list1,type(list1))
◆列表转换为元组
list1=            tuple1=tuple(list1) print(tuple1,type(tuple1))
◆元组中的值是不可以直接改变的
tuple1=('a','b','c')   tuple1.insert(0,'d')
print(tuple1)
◆元组中的值是可以间接来改变
Øtuple1 = ('a', 'b', 'c', 'd')    list1 = list(tuple1) #先改成列表       list1 = 'test' #通过列表改值
tuple1 = tuple(list1) #在转换成元组    print(tuple1)
★商汤科技面试题:
1>元组可以被改变吗?
当元组的元素作为一个整体时是不可以改变的,但是可以间接进行修改。首先把元组转换为列表,再进行修改元素,修改后再转换成元组
2>元组和列表的区别?
Ø定义符不一样.元组是(),列表是[],list表示列表,tuple表示元组
Ø元组是不能被修改的,列表是可以被修改的
Ø元组用于储存异构数据。即当做一个没有字段名的记录来使用,比如用元组来记录一个人的身高、体重、年龄信息,记录形式为:
person=(‘zhangsan’,180,80,20)
list[‘香蕉’,‘苹果’,‘猕猴桃’]
Ø元组是不可变类型,大小固定,列表是可变数据类型,数据可以动态变化,所以在内存占用方面,同样大小的数据,元组占用内存更少
3>如何修改列表里的元素
List=#定义一个列表   list=9#通过索引的方式把要修改的元素取出并进行赋值。以及通过一些列表函数修改元素   print(list)
4>如何修改元组中列表里的元素,比如把大娃改成大总
tuple=('董事长','总经理','合伙人',['大娃','二娃','三娃','四娃'])
tuple='大总'   print(tuple)#输出('董事长', '总经理', '合伙人', ['大总', '二娃', '三娃', '四娃'])
3.4.3元组和列表的区别
★相同:Ø都是序列类型的容器对象,可以存放任何类型的数据
      Ø支持切片、迭代等操作
★不同:Ølist 是可变的对象,元组tuple是不可变的对象
      Øtuple不可变,所以使用tuple可以使代码更安全
3.5Python中的字典和集合
3.5.1Python中的字典定义
字典(dict):是另一种可变容器模型,且可存储任意类型对象。存放一系列具有映射关系的数据结构,字典是无序的,是以key:value的形式存储数据
◆字典的每个键值key:value对用冒号:分割,每个键值对之间用逗号分割,整个字典包括在大括号{}中
◆字典同时是无序,字典都是以键值对的形式存在,先键后值,键是唯一的,值且不唯一
◆字典表达符:{}
◆字典的定义方式:
Ø法一:dict1={'name':'dishini','age':18} #通过{}直接定义
Ø法二:list = [('a',1),('b',2),('c',3)] dict2 = dict(list) #通过dict()方法定义
取值:通过key取value,例:dict==dict(list)print(dict)
3.5.2字典中常见的函数
◆添加一个键值对
Ødict1 = {"name":"xiaowang","age":"10"}
dict1['class']=1834 如果字典里已经有这个键,旧数据将会替换
print(dict1)
Ø#设置键绝对setdefault 类似添加
dict={'name':'zhangsan','age':18}
dict.setdefault('sex','男')print(dict)
#输出{'name': 'zhangsan', 'age': 18, 'sex': '男'}
Ø#如果字典存在键时,此时设置键值无效
dict.setdefault('sex','女')      print(dict)
#输出{'name': 'zhangsan', 'age': 18, 'sex': '男'}
◆字典添加元素setdefault()
dict1 = {'name':xiaowang,'age':18}
dict1.setdefault('sex','1')
print (dict1)
注:如果插入数据键已经在字典里,插入是不生效的,默认值为空时,插入数据为None
◆del删除字典
dict1 ={"name":"xiaowang","age":"18","sex":"1"}
del (dict1)
print(dict1)
◆取出键返回列表
dict1 = {"name":"xiaowang","age":"10"}
print (dict1.keys())

dict1 = {"name":"xiaowang","age":"10"}
print(key)或
                  for i in dict.keys()   #key存到i中
print(i)
◆取出值返回列表
dict1 = {"name":"xiaowang","age":"10"}
print (dict1.values())
◆取出具体键的值
Ødict1 = {"name":"xiaowang","age":"10"}
print (dict1['name'])
Ø取出具体的键以及对应键的值
dict={'name':'zhangsan','age':18}
for key in dict:
    print(key,dict)#打印字典的键以及对应的值
#输出name zhangsan   age 18
Ø取出具体的键以及对应键的值,并以列表形式返回
dict={'name':'zhangsan','age':18,'sex':'男'}
for i,j in dict.items():          print(i,j)
#输出name zhangsan
age 18
sex 男
◆del删除指定的键,连同值也删除
dict1 ={"name":"xiaowang","age":"18","sex":"1"}
del (dict1["name"])
print (dict1)
◆pop(key)函数,删除指定键并返回该指定键被删除的值
dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
print(dict.pop('name'))#输出zhangsan
◆clear()清空字典所有项
dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
dict.clear()   print (dict)
或print(dict.clear())#输出None
再打印print(dict)#输出{}
◆get(key)方法,通过key获取值,当键不存在,返回None(接口测试常用)
dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
print(dict.get('age'))#输出18
◆fromkeys函数初始化,函数可以给具体的键指定值
dict={}.fromkeys(['name','age'])#初始化字典,不指定,值默认
print(dict)#输出{'name': None, 'age': None}
dict['name']='老六'#指定值
print(dict)#输出{'name': '老六', 'age': None}
◆has_key函数或__contains__函数检查字典是否有指定的键,有返回True,没有返回False
Ødict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
print(dict.__contains__('name')) #返回true,因为键存在
Ø★dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
if dict.__contains__('nasa'):
    print('存在此键')
else:
    dict.setdefault('nasa','masike')
print(dict)
#输出{'name': 'zhangsan', 'age': 18, 'sex': '男', 'nasa': 'masike'}
◆popitem函数随机返回并删除字典中的键值对(一般删除末尾对)
如果字典已经为空,却调用了此方法,就报出KeyError异常
dict1 = {'name':xiaowang,'age':18,'class':24}
dict1.popitem()
print (dict1)#输出{'name': 'zhangsan', 'age': 18}
print (dict1.popitem())#输出('sex', '男')
print (dict1)#输出{'name': 'zhangsan', 'age': 18}
◆update函数利用一个字典更新另外一个字典
dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
dict1={'class':1832}
dict.update(dict1)
print(dict)#输出{'name': 'zhangsan', 'age': 18, 'sex': '男', 'class': 1832}
★注意:如果要更新的元素项在原字典里存在,则把原来的项覆盖
dict = {'name': 'zhangsan', 'age': 18, 'sex': '男'}
dict1={'age':1832}
dict.update(dict1)
print(dict)#输出{'name': 'zhangsan', 'age': 1832, 'sex': '男'}
◆字典的遍历:for...in...遍历字典
dict1 = {'name':xiaowang,'age':18}
for key in dict1:
print (key,dict1)
◆使用items()完成遍历,取键和值
dict1= {'name':xiaowang,'age':18}
for key,value in dict1.items():
print (key,value)
3.5.3Python中的集合
◆集合:最重要的功能就是去重
Ø可变集合set
set1.add('dcs')
set1.remove('dcs')
→test='hello'
m=set(test)
print(m)#输出{'h', 'e', 'l', 'o'}
print(type(m))#输出<class 'set'>
m.clear()#清空
print(m)#输出set()
m.pop()
print(m)#输出{'e', 'o', 'l'}#把集合最前面这个给删除了
→list1 =
list1.pop()
print(list1)#输出#把列表最后面这个给删除了
【拓】str='七夕节快乐'
for i in str:
   print(i,end='')#输出七夕节快乐
Ø不可变集合frozenset
test = 'hello'
a = frozenset(test)
b = a.copy()
b.add('888') #报错AttributeError: 'frozenset' object has no attribute 'add'
print (b)

页: [1]
查看完整版本: 老司机带你了解Python中的数据结构