介绍本文介绍了python中的三种组合数据类型。文章的后半部分将介绍如何使用“分片”来检索这些组合数据类型中的数据。文章目录0×1。元组0×2。列表0×3。字典0×4。数据切片实例0×1。元组在python中,使用括号创建元组(Tuple),如果括号中只包含一个元素,则需要在元素末尾添加一个逗号(没有逗号的数据将被创建为字符串或数字数据类型).元组创建后,不能添加或删除元素,其值是固定的。是的,请看下面的例子:#创建三个元组,b元组只包含一个字符串元素,所以末尾需要加一个逗号,否则b会创建为字符串对象,c元组是多维的tuple,包含a和b元组>>>a=(1,2,3,4,5)>>>b=("www.qingsword.com",)>>>c=(a,b)#打印输出三元组中的元素>>>print(a)(1,2,3,4,5)>>>print(b)('www.qingsword.com',)>>>print(c)((1,2,3,4,5),('www.qingsword.com',))#打印出a元组的第一个元素,python索引从0开始>>>print(a[0])1#打印出a元组的最后一个元素,len()函数会得到a元组的元素个数,因为索引从0开始,所以元素个数减一就是最后一个的索引号一个元素>>>print(a[len(a)-1])5#另一种获取元组最后一个元素的便捷方式,直接使用-1,以此类推,获取倒数第二个元素,使用-2作为索引值>>>print(a[-1])5>>>print(a[-2])4#得到多维元组中的第0个元素(一个元组)索引位置的值为2,也就是a子元组中的3>>>print(c[0][2])3#再看下面的例子,元组中包含一个列表,然后用索引修改值元组中列表的两个元素。上面提到的元组的不可变元素是指引用的位置保持不变(内存地址)。在这个例子中,元组t1中索引位置为2的元素指向一个list所在的内存地址,我们只是改变list元素,但不改变元组的方向,如果这个点改变到另一个列表或元素,就会产生错误>>>t1=(1,2,["x","y"])>>>打印(t1)(1,2,['x','y'])>>>t1[2][0]="a">>>t1[2][1]="b">>>print(t1)(1,2,['a','b'])#你甚至可以使用list方法向包含在元组中的列表添加和删除数据。list的相关操作将在本文Part2介绍>>>t1[2].append("c")>>>print(t1)(1,2,['a','b','c'])0×2。listpython中,可以使用方括号创建列表。上述元组实例中的大部分操作都适用于列表。您只需要用方括号替换圆括号。不同的是,当列表只包含一个元素时,末尾需要加一个逗号。此外,列表可以添加或删除元素。请看下面的例子:#创建三个列表,其中c为多维列表,包括a和b>>>a=[1,2,3,4,5]>>>b=["www.qingsword.com"]>>>c=[a,b]#打印出三个列表中的元素>>>print(a)[1,2,3,4,5]>>>print(b)['www.qingsword.com']>>>print(c)[[1,2,3,4,5],['www.qingsword.com']]#使??用list.append()方法添加一个元素到alist6>>>a.append(6)>>>print(a)[1,2,3,4,5,6]#append()方法一次只能添加一个元素,而list.extend()方法可以一次添加多个元素>>>a.extend([7,8,9])>>>print(a)[1,2,3,4,5,6,7,8,9]#利用extend()方法的特点,可以将一个列表中的元素完全复制到另一个列表中,创建如下创建一个空列表d,然后将c列表中的元素复制到d中。这里有一件奇怪的事情。创建c时,a列表仅包含前五位数字。现在c列表的第一个元素变成了9位。这是因为c列表的第一个元素只指向a列表的内存地址。当a列表发生变化时,c读取的数据也会发生变化>>>d=[]>>>d.extend(c)>>>print(d)[[1,2,3,4,5,6,7,8,9],['www.qingsword.com']]#使用list.remove()方法删除列表中的元素,该方法接收的不是索引值,而是元素值(在本例直接删除a列表中的元素1和2)>>>a.remove(1)>>>a.remove(2)>>>print(a)[3,4,5,6,7,8,9]#list.pop()方法接收一个索引值,如果没有指定索引值,默认为最后一个元素的索引值,该方法会取回对应的元素给调用者,然后从列表中删除元素>>>print(a.pop())9>>>print(a)[3,4,5,6,7,8]#删除索引值为0的元素>>>print(a.pop(0))3>>>print(a)[4,5,6,7,8]python提供了一个set()函数,用于处理列表中重复的元素,并将它们合并为一个元素,例如:#使用set()去除列表中的重复值>>>lst1=set([1,2,3,3,4,4])>>>lst2=set([3,4,5,5,6,6])>>>lst3=set(["a","a","b","c","c"])>>>打印(列表(lst1))[1,2,3,4]>>>print(list(lst2))[3,4,5,6]>>>print(list(lst3))['a','c','b']#集合类型列表可以用于科学计算,因为没有重复值,例如交集和并集>>>print(list(lst1&lst2))[3,4]>>>print(list(lst1|lst2))[1,2,3,4,5,6]除了手动输入每个列表的元素外,python还提供了列表的一个高级特性——“列表生成”,可以用for循环自动生成一个列表,例如:#“列表生成”语法:[循环判断语句或嵌套循环的元素结果表达式]#执行顺序即,先运行“for循环”,再执行“判断语句或嵌套循环”,将“for循环判断语句或嵌套循环”部分得到的每一个值放入“元素结果表达式”中进行计算,最后把结果保存在列表中#生成1~10中每一位的平方的列表>>>L0=[x*xforxinrange(1,11)]>>>print(L0)[1,4,9,16,25,36,49,64,81,100]#从0~9一个一个读取数字,如果读取的数字可以被2整除,则执行x*x并将结果保存到列表中>>>L1=[x*xforxinrange(0,10)ifx%2==0]>>>print(L1)[0,4,16,36,64]#嵌套循环,实现全组合,x相当于在外层循环,y相当于嵌套子循环,每个x会得到3个y值,每个结果执行x+y并将结果保存到列表>>>L2=[x+yforxin"ABC"foryin"abc"]>>>print(L2)['Aa','Ab','Ac','Ba','Bb','Bc','Ca','Cb','Cc']#大小写转换>>>L3=[x.upper()forxin"abc"]>>>print(L3)['A','B','C']>>>L3=[x.lower()forxin"ABC"]>>>print(L3)['a','b','c']#使用a和b变量读取字典{"one":1,"two":2}每个元素的key和value,最后用等号连接保存在列表中>>>L4=[a+"="+str(b)fora,bin{"one":1,"two":2}.items()]>>>print(L4)['two=2','one=1']#Yes当我们生成一组列表时,如果使用大小写转换函数,但是生成公式中包含数值类型,则会触发异常,例如L5=[x.lower()forxin["A","B",1,2]]#下面的方法可以解决这个问题。isinstance函数接收两个参数。第一个参数是传入的值,第二个参数是比较类型。当传入的值匹配比较类型时返回True。在下面的列表生成公式中,根据python中and和or的返回原则,当isinstance(x,str)为真时,返回x.lower(),即如果x为String,则转为小写,而当isinstance(x,str)为false时,"isinstance(x,str)andx.lower()"为false时,在or之后返回x,即不加任何修改地添加x到list>>>L5=[isinstance(x,str)andx.lower()orxforxin["A","B",1,2]]>>>print(L5)['a','b',1,2]的上面使用的“列表生成”在创建列表的时候就已经计算出了列表的所有成员并存储在内存中。这其实是不科学的。有时候我们创建的生成公式会计算很多元素。如果元素过多,会占用大量内存,我们只需要访问列表中的部分元素即可。这时候,我们可以使用另一种方式来创建列表——“列表生成器”(generator);和“列表生成器”不同。“列表生成器”只保存列表生成算法本身。只有当我们迭代“列表生成器”对象时,才会执行算法来计算我们访问的值。请看下面的例子:#创建一个“列表生成器”而不是“列表生成器”只需要把方括号改成圆括号>>>L6=(x*xforxinrange(0,10)ifx%2==0)>>>print(L6)
