3、Python基本类型之列表
一、列表
python中定义一个列表的基本语法是:[1,"python",12.34]。这个列表包含三个元素,整型的1,字符串类型的"python"和浮点数12.34。so,我们可以得出结论,列表中的元素类型可以是不同的数据类型(可以思考为毛可以)。
在我们学习了列表的数据类型定义后,下面我们来看一下列表的操作(增删改查)。
列表中增加一个元素:
1 list = [1,"python",12.34] 2 list.append("高大腿") #在列表的最后添加一个元素 结果显示 [1,"python",12.34,"高大腿"] 3 list.insert(1,"I") #在下标为1(计算机中下标都是从0开始)的位置插入"I",执行结果[1,"I","python",12.34,"高大腿"] 4 list.insert(-1,"6666") #在下标为-1(倒数第一)的位置插入"6666",执行结果[1,"I","python",12.34,"6666","高大腿"] 5 list.append([1,2,3,4]) #在列表中插入一个列表元素 执行结果[1,"I","python",12.34,"6666","高大腿",[1,2,3,4]] 6 print(list)
上面展示了列表的插入操作,总结如下:
1、如果想在列表最后一个位置插入元素,请用append方法。
2、如果想在列表的任意一个位置插入一个元素,请用insert方法,insert方法为插队方法,每次插入一个位置后,该位置后面的人依次向后移动。
3、insert方法中,当下标为负数时(-1)表示倒数的意思,比如-1就表示倒数第一个元素(可以思考是否可以用insert方法在列表的最后插入一个元素)。
4、列表中插入一个"元素",这里的元素指的是任意的数据类型的数据,当然也可以是列表,第6行的语法就是在列表的最后一个位置插入了一个列表元素。
删除列表元素:
1 list = ["I","like","learn","python","and","you","?"] 2 #del list #删除列表 3 del list[0] #删除列表第一个(下标为0)元素 执行结果['like', 'learn', 'python', 'and', 'you',"?"] 4 list.pop() #删除列表最后一个元素 执行结果['like', 'learn', 'python', 'and', 'you'] 5 list.remove("like") #删除列表中元素为"like"的元素 执行结果['learn', 'python', 'and', 'you'] 6 b = "like" in list #判断一个元素是否在列表中,执行结果False 7 b = "like" not in list #判断一个元素是否不在列表中,执行结果True 8 print list
上面展示了列表删除的操作,总计如下:
1、del 关键字是python内置的一个命令,其不光可以删除列表还可以删除其他类型的数据(牛B的一塌糊涂),但del list慎用,这就好比删除数据库中表的命令,要考虑一下后果(^ ^)。
2、删除列表中的任意一个位置的元素也是用del命令,语法如代码3,这个操作的功能和insert是一对冤家,但语法上稍有不同。
3、删除列表中最后一个元素用pop方法,这个方法和append方法是一对冤家。
4、remove方法是用于删除列表中的元素,其不是通过列表下标删除,而是通过元素内容删除,然鹅,我们有时候并不确定列表中是否存在我们想删除的元素,这时,我们需要用in 或者not in方法判断一下(代码6,7行)。
修改列表元素:
1 list = ["I","like","learn","python","and","you","?"] 2 list[0] = "you" #修改列表中任意一个位置的元素 执行结果 ['you', 'like', 'learn', 'python', 'and', 'you', '?'] 3 print list
修改元素比较简单:只有通过下标重新赋值即可。
查询列表元素:
1 list = ["I","like",["gwx",18]] 2 print list[1] #查看列表的第2个元素(下标为1),执行结果 like 3 print list[2] #查看列表的第3个元素,执行结果['gwx', 18] 4 print list[2][0] #查看列表第2个元素的第一个元素,执行结果gwx 5 print list[-1] #查看列表的最后一个元素,执行结果['gwx', 18]
列表元素的查询主要就是通过下标(索引)进行读取,层层递进直到取到你最终想要的元素,也是很好理解的,值得一提的是,索引下标为负时,同样表示倒数的意思,比如代码5。
列表元素的其它玩法:
除了以上的增删改查,对于列表元素还有一些其它的用法;
1 list = ["I","like",["gwx",18],"I"] 2 print list.count("I") #统计列表中某个元素的个数 执行结果 2 3 print list.index("like") #返回某个元素在列表中的索引,执行结果1 4 list.reverse() #列表的反转 执行结果['I', ['gwx', 18], 'like', 'I'] 5 list1 = [11,2,3,8,9,1] 6 list1.sort() #排序,执行结果[11, 9, 8, 3, 2, 1] 7 list.extend(list1) #合并两个列表,执行结果 ['I', ['gwx', 18], 'like', 'I', 1, 2, 3, 8, 9, 11] 8 print (list)
关于copy:
我们知道copy的意思的将一份内容复制一份,首先我们看下下面这段代码:
1 import copy 2 list = ["name",["account",100]] #定义一个列表模板 3 helen = copy.copy(list) #将列表list的数据复制一份给helen 此时helen的数据为["name",["account",100]] 4 helen_wife = copy.copy(list) #将列表list的数据复制一份给helen_wife 此时helen的数据为["name",["account",100]] 5 helen[0] = "helen" 6 helen_wife[0] = "helen_wife" 7 print helen #执行结果为['helen', ['account', 100]] 8 print helen_wife #执行结果为['helen_wife', ['account', 100]]
上面的代码描述如下:目前看起来还一切正常,符合咱们正常对copy的理解,这时候,我执行下面的操作:
1 helen[1][1] = 50
这句话的意思是,将helen的账号下面的金额修改为50,这时候我们思考一下,此时第7,8行代码将会输出怎样的结果?第7,8行执行的代码结果应该分别为:['helen', ['account', 50]]和['helen_wife', ['account', 100]]对吗?恭喜你,答错了,正确结果应该是['helen', ['account', 50]]和['helen_wife', ['account', 50]],纳尼????helen自己花了50块钱,为毛还要扣掉他媳妇账号里面的50块钱,我们很不理解,没关系,下面我们来看一个图。
其实我们在使用上面的copy方法的时候,计算机内存中是复制了一份同样大小的空间和值,而列表的存储方式是:对于多层级的列表都是存放的地址。而当我们修改age的值的时候,我们发现不管是通过helen去索引还是helen_wife去索引age的值都是一样的,也就是说对account和age的修改同时影响了helen和helen_wife,这不是我们想要的结果。对于这种方式的copy,我们称之为浅拷贝。如果我们要想实现完全拷贝的话,可以使用另一个方法copy.deepcopy()方法,这种完全拷贝的方式称为深拷贝。
切片:
切片是python中一个很重要的操作,其字面意思是将一串内容进行分割。
1 list = ["jak","helen","alex","mark","Lilie"] 2 print list[:] #完全切片 执行结果['jak', 'helen', 'alex', 'mark', 'Lilie'] 3 print list[2:5] #从第下标为2的元素开始切割,到下标为5的元素结束,但不包括下标为5的元素(顾头不顾尾) 执行结果['alex', 'mark', 'Lilie'] 4 print list[:4] #从下标为0的元素开始到下标为4的元素进行切片 执行结果['jak', 'helen', 'alex', 'mark'] 5 print list[1:] #从下标为1的元素开始到最后一个元素进行切片 执行结果['helen', 'alex', 'mark', 'Lilie'] 6 print list[2:5:2] #从下标为2的元素到下标为4的元素每隔一个进行切片,执行结果为['alex', 'Lilie'] 7 print list[1:5][2:6] #嵌套切片 执行结果['mark', 'Lilie']
上面的列子详细描述了列表的各种切片操作,值得注意的是,我们要关注嵌套切片的作用,当我们遇到一个比较复杂的问题时,如果我们一次切片无法完成,可以考虑嵌套切片。
元组:
元组是python里另一种数据类型,但我们可以认为元组是一类特殊的列表,其特殊在元组里面的元素是不可以被更改的。元组的定义如下:
1 t = ("jak","helen","alex","mark","Lilie") 2 print t # 执行结果('jak', 'helen', 'alex', 'mark', 'Lilie')
由此,我们总结如下:
1、元组是一类特殊的列表,元组的定义和列表的定义仅仅在于()和[ ]的区别
2、元组的内容一旦被定义,就无法被更改
3、元组的操作除了无法进行修改,其他的操作和列表是一模一样
所以,当我们执行这样一条语句时:
1 t = ("jak","helen","alex","mark","Lilie") 2 t[0] = "JAK" 3 print t
执行结果为:,其翻译成中文就是:元组对象不支持元素修改,所以我们学会了列表,很容易就掌握了元组。
OK,那么现在让我们看下面这样一段代码?执行会报错吗?
1 t = ("jak","helen","alex","mark","Lilie",["account",90]) 2 t[5][1] = 1000 3 print t
执行结果为:('jak', 'helen', 'alex', 'mark', 'Lilie', ['account', 1000]),思考为嘛呢!