我就是这样学习Python中的列表
1.列表
对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列表是比较强大的,它包含了很多不同类型的数据:整型数字,浮点型,字符串以及对象等。
不同于C++和Java,在Python中,没有在标准库中内置数组类型,而是通常利用列表来表示数组,同时它也比数组的使用要灵活得太多。
列表是Python中最基本的数据结构,列表中的元素的存储是有序的,所以我们可以直接利用索引去访问列表中的值。在学习数据结构时,我们知道,对一个数据结构的操作,无外乎增删改查四种。接下来本文将从这四个方面来介绍列表的一些常用小技巧。
1.1.列表中的增
对列表的增加操作有两种,一种是创建一个新的列表,一种是在一个已有的列表中增加一个新元素。我们首先介绍如何创建一个新的列表:
#创建一个空列表 list1=[] #创建一个默认值为0,长度为n的列表 list2=[0]*n #利用列表生成式创建列表 list3=[iforiinrange(10)] #5*5二维列表 list4=[[iforiinrange(5)]forjinrange(5)] #利用其他数据结构生成列表,list()函数接收一个可迭代对象作为参数 tuple1=(1,2,3) list5=list(tuple1) #字符串转化为列表 str1="Ilovecode" #每个元素作为列表中的一个元素 list6=list(str1) #按照指定字符分割 list7=str1.split("")#['I','love','code']
在编程过程中,有时我们需要对一个列表进行操作,但是列表是一个可变对象,对列表的操作往往会改变其本来的顺序结构。因此,当我们不想改变列表原有的顺序结构,我们需要对旧的列表进行一个拷贝,然后在新的列表上进行操作。拷贝存在两种,浅拷贝和深拷贝。可能有人会对这两种拷贝存在疑问,他们得到的列表的形式不是一样的嘛?
是的,它们在拷贝后得到的列表形式确实是一样的。但是在进行操作时,就会有很大的差别了,特别是当你的列表中存在可变对象时。我们只需要记住一点,浅拷贝只复制不可变对象,而深拷贝不仅复制不可变对象,还复制了可变对象。以下进行举例说明:
#如果一个列表中的元素都是不可变对象,可以直接用浅拷贝 list1=[1,2,'i'] list2=list1[::1]#浅拷贝 list3=[iforiinlist1]#浅拷贝 importcopy list4=copy.copy(list1)#浅拷贝 #如果一个列表中的元素包含可变对象,要完成复制列表,需要用深拷贝 list5=["Will",1,["Python","Java","C++"]] list6=copy.deepcopy(list5)
为什么在包含不可变对象的时候,需要用到深拷贝呢?
上面我们说过,浅拷贝只拷贝不可变对象。当列表中存在可变对象时,我们可以发现其引用id是一样的,即它们是同一个对象,因此对list5的操作会影响到list6。而在深拷贝中,对于可变对象,在拷贝的新列表中会生成一个新的对象,所以对list6的修改不会影响到list5。
id(list5[2])#2195936916360 id(list6[2])#2195936916744
对列表的另一种增加操作就是在已有的列表的基础上增加元素了,主要包括以下几种操作:
list1=["I"] #在列表尾部增加一个新元素 list1.append("love") #合并两个列表 list2=["Apple",3] list1.extend(list2)#["I","love","Apple",3] list1=list1+list2#["I","love","Apple",3] #在指定位置插入元素 list1.insert(index=1,"not")#["I","not","love","Apple",3]
1.2.列表中的删
对数据结构的删除操作包括两种,删除整个列表,或者删除列表中的某些元素。对于从内存中删除整个列表,该操作十分简单:
list1=[1,2,3] dellist1
对于删除列表中的元素,同样可以使用del语句,同时还可以使用remove()函数。
list1=[1,2,3] print(list1)#[1,2,3] dellist1[1] print(list1)#[1,3] #移除某个值的第一匹配项 list2=[1,2,2,3,5] list2.remove(2)#移除第一个值为2的元素
1.3.列表中的改
修改操作即在原有的列表的基础上对其进行修改,上面以及介绍了增加和删除操作,这里就对不改变元素的个数的操作进行介绍,主要包括排序和反转列表等。
#对一个整数列表进行排序 list1=[9,5,6,2,7,1,3] #升序排列 list1.sort()#[1,2,3,5,6,7,9] list1=sorted(list1)#[1,2,3,5,6,7,9] #降序排列 list1.sort(reverse=True)#[9,7,6,5,3,2,1] list1=sorted(list1,reverse=True)#[9,7,6,5,3,2,1] #指定键值排序 list1=[('a',3),('b',2),('c',1)] list1.sort(key=lambdax:x[1])#[('c',1),('b',2),('a',3)] ##反转列表,即将原来的列表逆序排列 list2=[4,2,3,1] list2=list2[::-1]#[1,3,2,4] list2.reverse()#[1,3,2,4]
1.4.列表中的查
对列表的查找操作无外乎以下几种:
- 遍历列表;
- 查找指定索引的元素;
- 查找指定值的元素;
列表的遍历方式有三种,分别是根据索引遍历、根据值遍历和enumerate()遍历。
list1=["Python","C++","Java"] #方法1 foriinrange(len(list1)): print(list1[i]) #方法2,遍历速度最高效,但是无法记录索引 foriinlist1: print(i) #方法3 forindex,valinenumerate(list1): print(val)
查找元素有两种,一种是按照索引查找,一种是遍历按值查找。
#查找指定索引的元素 list1=[1,3,2,5,7,8] list1[3]#返回索引为3的元素,值为5 #查找指定值的元素 key=5 foriinlist1: ifi==key: print("OK") #查找最大元素和最小元素 max(list1)#8 min(list1)#1
1.5.其它小技巧
上述介绍了列表的增删改查四种常用操作,当然对列表的操作不仅仅只有这些,例如还有两个列表的比较,列表结构的转化等等。
比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。
list5=[("car",1),("bike",2),("foot",3)] list6=[("car",1),("bike",2),("foot",3)] #判断两个列表是否是同一个对象 list5islist6#False #判断两个列表是否相等 list5==list6#True #当列表中的元素很多,且结构复杂时,可以使用numpy模块 importnumpyasnp a=np.array(list5) b=np.array(list6) (a==b).all()#True
列表结构的转化主要包括将列表转化为元组、集合、字符串和字典:
list1=["a","b","c","d","c"] #列表转化为元组 tuple1=tuple(list1)#('a','b','c','d','c') #列表转化为集合 set1=set(list1)#{'a','b','c','d'} #列表转化为字符串 str1="".join(list1)#'abcdc' #列表转化为字典,元素为key,次数为value fromcollectionsimportCounter,defaultdict dict1=Counter(list1)#Counter({'a':1,'b':1,'c':2,'d':1}) #或者 dict2=defaultdict(int) foriinlist1: dict2[i]+=1 dict2#defaultdict(int,{'a':1,'b':1,'c':2,'d':1})
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。