当前位置: 首页 > Linux

[Python]-4元组列表和字典

时间:2023-04-06 23:53:29 Linux

介绍本文介绍了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)at0x7faec4938410>#有两种方式让生成器执行算法,第一种方式是使用next()函数,如果next()已经获取到所有的值,会抛出StopIteration异常>>>print(next(L6))0>>>print(next(L6))4>>>print(next(L6))16>>>print(next(L6))36>>>print(next(L6))64>>>print(next(L6))Traceback(最近一次调用last):print(next(L6))StopIteration#但是实际next()函数在应用中很少用到,但是for循环迭代>>>L6=(x*xforxinrange(0,10)ifx%2==0)>>>forainL6:打印(a)041636640×3。字典在python中,可以使用花括号创建字典。字典中的每个元素都以“键值对”的形式存储。请看下面的例子:#有两种创建Dictionary的方式,第一种直接创建一个空字典,然后一个一个的添加键值>>>a={}>>>a["breakfast"]="牛奶鸡蛋">>>a["lunch"]="可乐牛排">>>a["晚餐"]="水果沙拉">>>print(a){'早餐':'牛奶和鸡蛋','Dinner':'FruitSalad','Lunch':'CokeSteak'}#第二种方法是创建字典,一次添加所有键值,每组元素之间用冒号隔开,在冒号是“key”,冒号之后是“value”>>>a={'breakfast':'milkEggs','Dinner':'FruitSalad','Lunch':'CokeSteak'}#python允许不同键值相同,所以下面的语法是正确的key]”读取值,或者使用“dictionary.get(key)”读取值,在使用get()方法取值时,如果获取的key不存在,get()方法将返回一个“无”,或者我们指定的值>>>print(a["breakfast"])milkeggs>>>print(a.get("lunch"))colasteak>>>print(a.get("233"))None#如果"233"在字典中不存在,则返回本站URL>>>print(a.get("233","www.qingsword.com"))www.qingsword.com#判断字典中是否存在键值对,除了使用get()方法查看返回是否为"None",也可以使用关键字in,存在则返回True,否则返回False>>>"b??reakfast"inaTRUE#读取字典键值列表>>>print(a.keys())dict_keys(['早餐','晚餐','午餐'])>>>print(a.values())dict_values(['牛奶鸡蛋','水果沙拉','可乐牛排'])#此外,还可以使用items()方法读取字典中的每一组“键值对”>>>forzina.items():print(z)('dinner','fruitsalad')('breakfast','milkandeggs')('Lunch','CokeSteak')#如果使用两个参数,则可以得到每组键值对中的单个键值数据>>>forx,yina.items():print(x,y)LunchCokeSteakBreakfastMilkEggDinnerFruitSalad#如果要删除字典中的“键值对”,可以使用pop()方法将字典中的一个键名传递给该方法,可以取出并删除对应的“键值对”>>>a.pop("Breakfast")>>>print(a){'晚餐':'水果沙拉','午餐':'可乐牛排'}0×4。DataShardingpython中的例子可以通过数据分片达到读取某个字符串中单个字符的目的。这个想法也适用于元组和列表。如果列表中存储的字符串是一个字符串,则可以通过分片技术进行检索。一个元素的第一个字符,这种方法在某些环境下会很实用,请看下面的例子:#先看python提取字符串数据片段的方法,本例提取a指向的字符串数据中,单索引位置为2的字符>>>a="abcdefg">>>print(a[2])c#列表数据中,每个字符串元素可以看做一个子列表,利用多维列表的思想,提取子列表中对应索引位置的值>>>b=["www.qingsword.com","abcdefg","12345678"]>>>print(b[0][4])q#提取索引位置为2的元素的最后一个字符b>>>print(b[2][-1])8利用字符串分片技术,提取一组列表中每个元素的首字母作为字典的key,并对应到这个元素的值。下面是一个比较完整的程序:#!/usr/bin/envpython3#Createalistofnamesa=["Qingsword","John","Tom","George","Kali","Eva"]x=0#创建一个空字典b={}#当x的值小于列表中的元素个数时循环whilex>>a="123456789">>>print(a[2:6])3456#从b中索引3(d)的位置开始,直到索引5的位置(f)>>>b=["a","b","c","d","e","f","g"]>>>打印(b[3:5])['d','e']#再看几个例子,创建一个包含元素1~9的列表>>>L=list(range(1,10))>>>print(L)[1,2,3,4,5,6,7,8,9]#取出列表倒数第三个元素所有元素到最后>>>print(L[-3:])[7,8,9]#取出列表倒数第三个到倒数第一个元素(不包括最后一个元素)>>>print(L[-3:-1])[7,8]#如果从第一个元素开始,可以省略冒号前的0>>>print(L[:3])[1,2,3]#从第1到第6个元素,每隔一个元素取一个(步长为2)>>>print(L[:6:2])[1,3,5]#所有列表元素,每隔一个取一个元素>>>print(L[::2])[1,3,5,7,9]#方括号里什么都不写,只写一个冒号,也就是取所有元素>>>print(L[:])[1,2,3,4,5,6,7,8,9]#同样的切片操作也适用于元组和字符串>>>T=tuple(range(1,10))>>>print(T[::2])(1,3,5,7,9)>>>s="www.qingsword.com">>>print(s[::2])'wwqnsodcm'