文章内容
2017/9/22 11:02:42,作 者: 黄兵
列表、元组和字符串 (一)
一 列表:一个“打了激素”的数组
数组就是把一大堆同种类型的数据挨个摆在一块,然后通过数组下标进行索引。但是放在一起的数据类型必须一致。由于Python没有数据类型,也就是说Python没有数组,但是Python有一个更为强大的列表。如果把数据比作一个集装箱的话,那么列表就是一个工厂的仓库。列表是Python中使用最对的。
1.1 创建列表
创建列表和创建普通的变量一样,都是用括号括起来,数据之间用逗号隔开,这样一个普通的列表就创建好了。
>>> number = [1,2,3,4]
创建一个打了激素的列表
>>> max = [1,"wolf",[2,4],3.4]
根据上面的列表可以看出,列表中有整数、字符串、列表和浮点数,甚至还可以把列表当成一个元素。如果刚开始不知道在列表中加些什么的话可以直接创建一个空列表,后续再添加。
>>> empty = []
1.2 向列表添加元素
列表是相对灵活的,所以它的内容不是固定不变的。现在尝试在列表中添加元素,先说第一个方法append()方法:
>>> max = [1,"wolf",[2,4],3.4]
>>> empty = []
>>> max.append(4)
>>> empty.append("wolf")
>>> max
[1, 'wolf', [2, 4], 3.4, 4]
>>> empty
['wolf']
通过上面的两个例子我们发现添加的元素都加入到列表的末尾了,和BIF内置函数不一样,这个我们在对象里说,这里不做过多的说明。但是我想在列表里加入多个元素需要如何操作呢?这里需要用到extend()。
>>> max.extend([3,4])
>>> max
[1, 'wolf', [2, 4], 3.4, 4, 3, 4]
extend()不管添加多少个元素,都是以列表的形式进行添加,然后排在最后。那么我们想修改某一个元素该如何操作呢?下面看一下insert()方法。insert()方法有两个参数:第一个参数代表在列表中的为知,第二个参数是在这个位置外插入一个元素。下面咱们来试一下:
>>> max
[1, 'wolf', [2, 4], 3.4, 4, 3, 4, 3]
>>> max.insert(2,2)
>>> max
[1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]
等等,上面的insert输入的不是2吗?为什么修改的是第3个元素。是这样的凡是顺序索引,Python均是从0开始的,也是大多数编程语言约定的俗成规范。那么大家知道为什么要用0表示第一个数吗?
是因为计算机原本就是一个二进制的,在二进制的世界不是0就是1两个数:0当然是二进制里的第一个数字了嘛。这就是二进制的世界,所以0也就习惯表示第一个数。
>>> max.insert(0,0)
>>> max
[0, 1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]
1.3 从列表中获取元素
列表和数组一样,都是通过元素的索引值(index)从列表获取单个元素,注意:列表索引值是从0开始的:
>>> max
[0, 1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]
>>> max[4]
[2, 4]
>>> max[2]
'wolf'
按照这个方法,我们把两个元素的位置互换一下
>>> max[2], max[4] = max[4],max[2]
>>> max
[0, 1, [2, 4], 2, 'wolf', 3.4, 4, 3, 4, 3]
1.4 从列表删除元素
从列表中删除元素,这里介绍三种方法:remove(),del和pop()删除元素。
>>> max.remove("wolf")
>>> max
[0, 1, [2, 4], 2, 3.4, 4, 3, 4, 3]
使用remove()删除元素,不需要知道元素在列表中的具体位置,只要确定元素在列表中即可,如果删除的元素不在列表中就会报错。
>>> max.remove(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
既然remove()不能利用元素位置删除元素,我们就用del。
>>> del max[2]
>>> max
[0, 1, 2, 3.4, 4, 3, 4, 3]
第二个索引位置原本是一个列表,del是一个语句,不是一个列表的方法,所以你不必在它的后面加一个小括号(),另外,如果想删除整个列表,可以在del后面加列表名;
>>> del max
>>> max
<built-in function max>
最后,我们看一下pop()方法"弹出"元素;
>>> max = [1,"wolf",[2,4],3.4]
>>> max.pop()
3.4
>>> max
[1, 'wolf', [2, 4]]
使用pop()方法,默认弹出列表的最后一个元素,但是pop()可以灵活应用,只需要给pop()加一个列表的索引值作为参数,就会弹出一个索引值对应的元素。
>>> max.pop(1)
'wolf'
>>> max
[1, [2, 4]]
1.5 列表分片
利用索引值,可以很方便的从列表中获取一个元素。但是如果想一次获取多个元素,又该如何实现呢?这就用到了列表的分片(slice),可以方便地实现这个要求;
>>> number = [0,1,2,3,4,5,6,7,8,9]
>>> number[0:2]
[0, 1]
Python默认开始位置是从0开始的,所以在切片的时候如果想从0开始可以省略,如果没有放任何的索引值,而只有一个冒号,就会得到整个列表的拷贝。
>>> number[:2]
[0, 1]
>>> number[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如果想从最后一位开始切片,那该如何操作呢?下面看一下例子:
>>> number[-3:]
[7, 8, 9]
根据例子可以看出从最后一位开始查找的时候索引值不是从0开始了,那么最后一个索引值从后往前是多少呢?它是如何查找的呢?
>>> number[-1]
9
>>> number[-4]
6
>>> number[-4:]
[6, 7, 8, 9]
列表的最后一位的索引值是-1,根据负数计算索引值,以0位基准前面数是正数,后面是负数。列表切片是建立在原列表的一个拷贝(或者说是一个副本),所以如果想对列表做出一些修改,还想保持原来的那个列表,就可以直接用分片的方法获取拷贝就很方便了。
1.6 列表分片的进阶玩法
列表的分片实际上是可以接受三个参数的,其代表的是步长,默认情况下是1,可以改成3看一下是什么效果?
>>> number[0:-1:3]
[0, 3, 6]
从第一个元素到最后一个元素,步长3。也可以这样写:
>>> number[::3]
[0, 3, 6, 9]
前面也有说一个冒号可以打印所有的列表,所以这样也就更简单了。如果步长修改成负数,会怎么样呢?
>>> number[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
负数的步长,就把列表进行反转了。
如果我们在切片的时候取的索引值大于列表的索引会怎么样?
>>> number[10:]
[]
有不懂的同学可以自己琢磨一下,这个问题的详细答案我们在后面再解释。
1.7 一些常用的操作符
上一节学到的操作符并不是针对分支,在列表中也可以进行使用,下面看一下几个例子:
>>> list1 = [123]
>>> list2 = [234]
>>> list1 > list2
False
>>> list2 = [234,345]
>>> list1 = [456,123]
>>> list1 > list2
True
看第一个例子的时候可以轻易的看出对比的结果。但是如果列表中有两个元素的时候就有点不太好判断了,第二个例子我们可以看出判断结果,如果换一个例子呢?
>>> list1 = [123,456]
>>> list2 = [234,789]
>>> list1 > list2
False
这样就不好判断了吧,其实列表之间的对比没有你想的那么“智能”(在后面我们会讲如果把列表改变的更聪明)。当列表有多个元素的时候,默认是从第一个元素开始比较的,只要有一个元素大于另一个列表中的元素,第一个列表就大,字符串之间的比较也是一样的,只是字符串自检比较的是根据第一个字符对应的ASCII码的值的大小。
在列表中字符串可以使用(+)进行拼接,可以使用(*)复制自身诺干次。下面看个例子:
>>> list1 = ["Hello"]
>>> list2 = ["Word"]
>>> list1 + list2
['Hello', 'Word']
加号(+)也叫连接符,它可以把多个列表对象合并在一起,有点类似extend()的效果,一般还是建议使用extend()方法来实现扩展,这样更规范专业一些。连接符只是连接两个对象,不是添加,这个要记得。如果一定要添加可以使用append()或insert()方法进行添加。下面说说使用乘号(*)也叫重复操作符,重复操作符可以在列表中:
>>> list1 = ["Hello"]
>>> list1 * 3
['Hello', 'Hello', 'Hello']
>>> list1 * = 5
['Hello', 'Hello', 'Hello', 'Hello', 'Hello']
重复操作符是重复列表中的元素,当然复合赋值运算符也可以用于列表的。记得重复操作符是重复的列表中的元素。
另外在for循环中我们学到的成员关系操作符也可以用于列表,in和not in我们称之为关系操作符!
>>> list = ["wolf","Hello","Word","Python3v"]
>>> "Python3v" in list
True
>>> "Python3" not in list
True
我们在前面学过用列表作为一个列表元素存在列表中,那么如果判断列表中的列表元素能不能使用成员关系in或not in测试呢?试一下看看:
>>> list = [1,2,3,[4,5,6],7,8]
>>> 4 in list
False
>>> 5 not in list
True
例子中我们测试的结果就是只能判断外层的成员关系,这个跟break和continue语句是一样的跳出一个层次的循环是一个道理,如果想判断列表里的列表元素,应该先进一层列表然后再判断:
>>> list = [1,2,3,[4,5,6],7,8]
>>> 4 in list[3]
True
>>> 5 not in list[3]
False
这里说一下,如果获取列表中的列表元素,这个和C语言的是一样的,需要先访问第一层列表然后再访问第二层列表:
>>> list = [1,2,3,[4,5,6],7,8]
>>> list[3][2]
6
可以看一下,访问第一层的时候也是根据列表的获取是一样的,第二层同样也是,只要是列表,第一个元素永远是0.
1.8 列表的小伙伴们
在Python中有很多关于列表的小伙伴的,我们该如何查看,找到这些小伙伴呢?下面让Python自己告诉我们:
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
这里有几个我们在前面说过的append(),extend(),insert(),pop(),remove()都是我们学过的,下面给大家说几个常用的方法:
count()这个方法是计算参数在列表中出现的次数的:
>>> list = [1,2,3,4,3,2,3,6,7,3,2]
>>> list.count(3)
4
这里说一下count()方法计算的是一层的列表,别上次更多层列表就把多层列表也算进去了,可以看下面的例子:
>>> list = [1,2,3,[2,3],5,2]
>>> list.count(3)
1
index()方法,是返回它的参数在列表中的位置:
>>> list = [1,2,3,[2,3],5,2]
>>> list.count(3)
1
>>> list.index(3)
2
>>> list.index(2)
1
可以看出返回的参数如果有重复返回第一个目标,也只在一层列表中。不过index()方法还有一个两个参数,用于限定查找的范围,因此可以这样查找第二个目标在list的位置。
>>> list = [1,2,1,4,1,6,1,8,1,0]
>>> start = list.index(1) + 1
>>> stop = len(list)
>>> list.index(1,start,stop)
2
评论列表