作者:韩信子@ShowMeAI教程地址:http://www.showmeai.tech/tuto...本文地址:http://www.showmeai.tech/article-detail/83声明:版权所有,转载请联系平台和作者并注明出处Python3数据结构Python中有大量的数据结构和容器可供编程使用。这一节我们总结一下之前学过的知识点,拓展一些新的知识点。让我们介绍一下Python数据结构。1.Python列表Python中的列表是可变的,这是区别于字符串和元组的最重要的特性。一句话:列表可以修改,但字符串和元组不能。Python列表详见序言Python列表及其应用下面是Python中列表的方法:方法说明list.append(x)在列表末尾添加一个元素,相当于a[len(a):]=[x]。list.extend(L)通过添加指定列表的所有元素来扩展列表,相当于a[len(a):]=L。list.insert(i,x)在指定位置插入一个元素。第一个参数是前面要插入的元素的索引,比如a.insert(0,x)会插入到整个列表之前,和a.insert(len(a),x)是等价的到a.append(x)。list.remove(x)删除列表中值为x的第一个元素。如果没有这样的元素,则返回错误。list.pop([i])从列表中的指定位置移除元素并返回它。如果没有指定索引,a.pop()返回最后一个元素。然后从列表中删除该元素。(方法中i两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你在Python库参考手册中经常会遇到这种情况。)list.clear()将参数从列表。的所有项都等于dela[:]。list.index(x)返回列表中第一个值为x的元素的索引。如果没有匹配的元素,则返回错误。list.count(x)返回x在列表中出现的次数。list.sort()对列表中的元素进行排序。list.reverse()反转列表中的元素。list.copy()返回列表的浅表副本,等于a[:]。下面的例子演示了list的大部分方法(在线python3环境):a=[2,123,123,1,1234.5]print('''a.count(123),a.count(1),a.count('x')''')print(a.count(123),a.count(1),a.count('x'),"\n")a.insert(2,-1)print('''a.insert(2,-1)''')print(a,"\n")a.append(456)print('''a.append(456)''')print(a,"\n")a.index(456)print('''a.index(456)''')print(a.index(456),"\n")a.remove(456)print('''a.remove(456)''')print(a,"\n")a.reverse()print('''a.reverse()''')print(a,"\n")a.sort()print('''a.sort()''')print(a,"\n")运行结果a.count(123),a.count(1),a.count('x')210a.insert(2,-1)[2,123,-1,123,1,1234.5]a.append(456)[2,123,-1,123,1,1234.5,456]a.index(456)6a.remove(456)[2,123,-1,123,1,1234.5]a.reverse()[1234.5,1,123,-1,123,2]a.sort()[-1,1,2,123,123,1234.5]注意:修改列表的方法,如插入、删除或排序,没有返回值。2.将list方法当栈使用,可以方便的把list当栈使用。栈是一种特定的数据结构,第一个进入的元素最后一个被释放(后进先出)。可以使用append()方法将元素添加到堆栈的顶部。使用不指定索引的pop()方法从堆栈顶部释放元素。参考如下代码(在线python3环境):stack=['Baidu','ShowMeAI','google']stack.append('ByteDance')stack.append('Tencent')print(stack)stack.pop()print('''stack.pop()''')print(stack,"\n")stack.pop()print('''stack.pop()''')print(stack,"\n")stack.pop()print('''stack.pop()''')print(stack,"\n")结果为['百度','ShowMeAI','google','字节跳动','腾讯']stack.pop()['百度','ShowMeAI','google','字节跳动']stack.pop()['百度','ShowMeAI','google']stack.pop()['Baidu','ShowMeAI']3、把列表当队列也可以把列表当队列,但是先加入队列的元素最先取出;但是为此目的使用列表效率不高。在列表末尾添加或弹出一个元素很快,但从列表头部插入或弹出元素并不快(因为所有其他元素都必须一个一个地移动)。fromcollectionsimportdequequeue=deque(['Baidu','ShowMeAI','google'])queue.append('ByteDance')queue.append('腾讯')print(deque)print('''queue.popleft()''')print(queue.popleft(),"\n")print('''queue.popleft()''')print(queue.popleft(),"\n")print(deque)运行结果是queue.popleft()Baiduqueue.popleft()ShowMeAI4.列表推导列表推导提供了一种从序列创建列表的简单方法。通常应用程序对序列的每个元素进行一些操作,将得到的结果作为一个元素生成一个新的列表,或者根据一定的判定条件创建一个子序列。每个列表理解都有一个for后跟一个表达式,然后是零个或多个for或if子句。返回结果是根据表达式从下面的for和if上下文生成的列表。如果希望表达式推导出元组,则必须使用括号。vec=[1,2,3]#将列表中的每个值乘以三得到一个新列表:three_times_vec=[3*xforxinvec]print(three_times_vec)#对列表中的每个值进行平方,并形成一个用原值列表,然后形成一个新列表:cmp_x_square=[[x,x**2]forxinvec]print(cmp_x_square)operationresult[3,6,9][[1,1],[2,4],[3,9]]列表推导也可用于为序列中的每个元素调用函数方法:fruits=['banana','loganberry','apple']print([fruit.upper()forfruitinfruits])#Output['BANANA','LOGANBERRY','APPLE']在listcomprehension中,可以使用if子句构建过滤器来过滤生成的结果:[3*xforxinvecifx>2]#result[9][3*xforxinvecifx<3]#result[3,6]您还可以组合两个列表以使用列表理解来构建更复杂的结果vec1=[1,2,3]vec2=[4,5,6][x*yforxinvec1foryinvec2]#二乘二得到一个新列表#result[4,5,6,8,10,12,12,15,18][x+y代表xinvec1foryinvec2]#两两相加得到一个新列表#Result[5,6,7,6,7,8,7,8,9][vec1[i]*vec2[i]foriinrange(len(vec1))]#对应位置相乘得到一个新列表#结果[4,10,18]5.嵌套列表解析Python列表也可以嵌套。下面代码展示了一个3X4的矩阵列表(在线python3环境):matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12],]#will3X4矩阵列表转为4X3列表:trans=[[row[i]forrowinmatrix]foriinrange(4)]print(trans)#相当于下面的方法,但是上面的方法更concisetransposed=[]foriinrange(4):transposed_row=[]forrowinmatrix:transposed_row.append(row[i])transposed.append(transposed_row)print(transposed)6.del语句使用del语句来从列表中选择索引而不是值来删除元素。这与使用pop()返回值不同。您可以使用del语句从列表中删除一个cut,或者清空整个列表(我们之前介绍的方法是为cut分配一个空列表)。例如:a=[1,2,3,456,789,1234.5]dela[0]#[2,3,456,789,1234.5]dela[2:4]#[2,3,1234.5]dela[:]也可以用del删除实体变量:dela7。元组元组由几个逗号分隔的值组成,例如:t=12345,54321,'hello!'t[0]#12345t#(12345,54321,'hello!')u=t,(1,2,3,4,5)u#((12345,54321,'hello!'),(1,2,3,4,5))tuplein输出总是用括号括起来,以方便嵌套结构的正确表示。它们可以带括号也可以不带括号输入,但它们通常是必需的(如果元组是更大表达式的一部分)。8.集合集合是一组无序且不重复的元素。基本功能包括关系测试和消除重复元素。可以使用大括号({})创建集合。注意:如果要创建空集合,必须使用set()而不是{};后者创建一个空字典,我们将在下一节介绍的数据结构。下面是一个简单的代码示例(在线python3环境):basket={'apple','orange','apple','pear','orange','banana'}print(basket)#deleteduplicate#result{'orange','banana','pear','apple'}'orange'inbasket#Detectmembers#ResultTrue'crabgrass'inbasket#ResultFalse#下面演示两个set的操作a=set('abracadabra')b=set('alacazam')a#a中的唯一字母#结果{'a','r','b','c','d'}a-b#a中的字母,但不在b#结果{'r','d','b'}b#lettersinaorb#结果{'a','c','r','d','b','m','z','l'}a&b#lettersinbothaandb#结果{'a','c'}a^b#在a或b字母中,但不是在a和b中#结果{'r','d','b','m','z','l'}9.字典另一个非常有用的Python内置数据类型是字典。与由连续整数索引的序列不同,字典由键索引,键可以是任何不可变类型,通常是字符串或数字。将字典视为键=>值对的无序集合的最佳方式。在同一个字典中,键必须彼此不同。一对大括号创建一个空字典:{}。company={'ShowMeAI':1234,'Baidu':5678}company['guido']=4127company#Result{'Baidu':5678,'guido':4127,'ShowMeAI':1234}company['ShowMeAI']#Result1234delcompany['Baidu']company['irv']=4127company#Result{'guido':4127,'irv':4127,'ShowMeAI':1234}list(company.keys())#Result['irv','guido','ShowMeAI']sorted(company.keys())#结果['guido','irv','ShowMeAI']'guido'incompany#ResultTrue'ShowMeAI'notincompany#ResultFalse构造函数dict()直接从键值元组列表构建字典。另外,可以使用字典推导式创建任意键值的表达式字典:dict([('ShowMeAI',1234),('Baidu',5678)])#result{'ShowMeAI':1234,'Baidu':5678}{x:x**2forxin(2,4,6)}#result{2:4,4:16,6:36}如果键只是一个简单的字符串,使用关键字参数指定键值对有时更方便:dict(ShowMeAI=1234,Baidu=5678)#Result{'ShowMeAI':1234,'Baidu':5678}10.遍历技巧在字典中遍历时,关键字和对应的值可以用items()方法同时解释:knights={'ShowMeAI':1234,'Baidu':5678}fork,vinknights.items():print(k,v)时在序列中遍历,可以使用enumerate()函数同时获取索引位置和对应的Values:fori,vinenumerate(['tic','tac','toe']):print(i,v)#0tic#1tac#2toe可以使用zip()组合一个或多个序列:questions=['name','age','color']answers=['ShowMeAI','30','blue']forq,ainzip(questions,answers):print('{0}是什么?就是{1}.'.format(q,a))#叫什么名字?是ShowMeAI。#任务是什么?是30.#是什么颜色?它是蓝色的。反向遍历一个序列,首先指定序列,然后调用reversed()函数:foriinreversed(range(1,10,2)):print(i)#9#7#5#3#1要按顺序遍历一个序列,使用sorted()函数返回一个排序后的序列而不修改原始值:basket=['apple','orange','apple','pear','orange','banana']forfinsorted(set(basket)):print(f)#apple#banana#orange#pear本教程系列的数据和代码下载代码可以在ShowMeAI对应的github上下载,可以在本地python环境下运行。会科学上网的宝宝们也可以直接使用googlecolab一键互动运行学习!本系列教程涉及的Python备忘单可在以下地址下载:Python备忘单扩展参考资料Python教程-Python3文档Python教程-廖雪峰官网ShowMeAI相关文章推荐python基本数据类型python运算符python条件控制和if语句python循环语句pythonwhile循环pythonfor循环pythonbreak语句pythoncontinue语句pythonpass语句python字符串和操作pythonlistpythontuplepython字典pythonsetpython函数python迭代器和生成器Python数据结构Python模块Python文件读写Python文件和目录操作Python错误和异常处理Python面向对象编程PythonNamespaceandScopePythonTimeandDateShowMeAI系列教程推荐图Python编程:从入门到精通系列教程图解数据分析:从入门到精通系列教程ls图解AI数学基础:从入门到大师系列教程图解大数据技术:从入门到大师系列教程