当前位置: 首页 > 科技观察

从5个维度总结Python数据结构的关系,发现了这些技巧

时间:2023-03-13 14:32:03 科技观察

在python中,我们经常使用列表、字典等数据类型来存储数据或重构一个序列,它们之间也存在一些关联。接下来,我们将对python中常用的几种数据类型进行全面的回顾。区别是一样的。两者都相当于一个容器,具有存储数据的功能。它们可以用for...in循环。不同的是序列存储的是不同类型的数据,而迭代器存储的是算法。sequence是预先存储数据,在获取数据的时候通过循环或者索引来检索数据;而迭代器不需要存储数据,获取数据时通过算法获取下一条数据。序列中的每个数据都需要开辟内存空间;而迭代器则不需要,每次只需要通过算法计算出下一个值即可。从这个角度来看,处理大量数据使用迭代器更合适。序列可以通过索引或键名获取值,而迭代器只能使用next()获取下一个值。变化趋势是从左到右,你可以试着找出一些规律。从数据排序的角度来看,从左到右可以看出是无序的、有序的、规则的(也可以定义为有序的)。从数据操作的灵活性来看,左侧操作更灵活,可以增删改查;右边比较简单,只能查询(注:定义的字符串只能查询,方法生成的字符串不是原始字符串)。如果想关注这些数据类型中的具体方法,可以参考:python的5种数据结构,方法很多,记不住?都在这里了。从定义数据类型的符号来看,也是按照汉字的大小引号来实现的,比如字典|集合就是花括号,列表就是括号,元组就是圆括号,字符串要么是double引号或单引号。数据类型之间的相互转换以上不同的数据类型也可以实现两者之间的相互转换。转换时只需要调用相应的函数即可,如下图所示。下图给出了各个数据类型之间的相互转换和具体例子。从上表可以看出,数据类型是可以相互转换的。总结有以下几点:无论转换什么数据类型,具体的数据类型都是用关键字括起来的,比如把元组转换成列表:list(tuple)转换成字典,需要注意的是每一对数据必须用括号括起来,这样才能正确生成字典的键值对,转换元素时会报错。在转为字符串时需要注意的是,虽然str(data)可以转为字符串,但很多情况并不是我们想要的。我们更想要的是将序列中的元素组合成一个字符串,如果要实现这样的需求,可以使用join()方法来实现。转换为字典时,必须将两个元素组合成一个元组进行转换。为了简单起见,我们可以更方便地使用zip()来形成两个序列的新字典。#通过zip将两个list合并成一个sequence,然后再转换成字典。lst1=['x','y','z']#可以是列表、元组、集合lst2=[123,234,345]print(dict(zip(lst1,lst2)))#output:{'x':345,'y':234,'z':123}虽然str()转换后的数据变成了字符串,但我们更希望的是将序列中的元素组合成一个字符串。然后你可以使用join()方法将其中的元素更改为所需的字符串。#Syntax:"sep".join(seq)#Example:x="".join({'a':123,'b':345})print("x:",x)y=",".join(['java','python','c++'])print("y:",y)z="_".join(("tuple","demo","01"))#输出:x:aby:java,python,c++z:tuple_demo_01#说明:sep为分隔符,seq序列写的方便——推导在上面的数据结构中,有些数据类型也支持推导,推导可以是一个表达式结构从一个可迭代对象构造一个新的可迭代对象。通过推导可以快速实现一个新的序列或生成器,代码也可以更优雅、更快速。为了更加直观,我们可以将不同数据类型所支持的推理总结成一张图。我们只需要记住推导433即可。字典推导#Syntax:{forkey,valueindictcondition}#Example:d={'chinese':88,'math':92,'english':93,'history':84}print("成绩大于90分的科目:",{k:'excellent'fork,vind.items()ifv>=90})#输出成绩大于90分的科目:{'math':'excellent','english':'excellent'}#说明:for循环后面的表达式可以是条件表达式也可以是循环表达式,主要用于过滤或者嵌套循环。出自新词典。集合推导:#Syntax:{forxinsetcondition}#Examples={x**2forxin[1,2,3]}print("Sets:",s)#Output:Sets:{1,4,9}列表理解#Syntax:[operation(x)forxinlistcondition]#Exampleprint([random.randint(1,10)+xforxinrange(0,10)ifx%2==0])#Result:[3,3,14,15,12]#说明:#常用于列表推导的几种用法用法一:[xforxiniterable]#循环后直接打印用法二:[xforxiniterableifcondition(x)]#对x的条件判断用法三:[operation(x)forxiterableifcondition(x)]#判断x的条件后,再对x进行运算用法4:[operation(x,y)forxiniterableforyiniterable1]#嵌套循环,对x,y进行运算生成器求导#语法:(operation(x)forxiniterablecondition)#Exampleprint((random.randint(1,10)+xforxinrange(0,10)ifx%2==0))#Result:at0x02FDC420>#Description:新generated生成器可以使用for循环,或next()来获取它的下一个值。组合使用以上数据结构不仅可以作为容器使用,还可以组合起来做其他用途。例如,它可以用作条件语句。为了直观起见,我们先写一个简单的if语句。score=92ifscore>=90:print('Excellent')else:print('Good')#Output:Excellent接下来我们通过以下三种方式重新定义条件语句。第一种,用()+[]实现条件判断#语法:(,)[condition_expression]#例子:score=92print(('good','excellent')[score>=90])#结果:优秀#解释:在[]中写条件语句,在()中写返回true和返回false的值。一定要注意顺序,()在前面,[]在后面,用{}+[]实现条件判断#语法:{True:,False:}[]#例子:score=92print({True:'Excellent',False:'Good'}[score>=90])#Result:Excellent#Description:在[]中写条件语句,在()中写返回trueand如果返回值为false,必须注意顺序的三阶。条件判断字符串,需要用到eval方法。#语法:eval("字符串判断语句")#示例print('excellent'ifeval("score>=90")else'good')#结果为优