文章内容

2017/9/22 11:02:42,作 者: 黄兵

列表、元组和字符串 (一)

一 列表:一个“打了激素”的数组

数组就是把一大堆同种类型的数据挨个摆在一块,然后通过数组下标进行索引。但是放在一起的数据类型必须一致。由于Python没有数据类型,也就是说Python没有数组,但是Python有一个更为强大的列表。如果把数据比作一个集装箱的话,那么列表就是一个工厂的仓库。列表是Python中使用最对的。

1.1 创建列表

创建列表和创建普通的变量一样,都是用括号括起来,数据之间用逗号隔开,这样一个普通的列表就创建好了。

  1. >>> number = [1,2,3,4]

创建一个打了激素的列表

  1. >>> max = [1,"wolf",[2,4],3.4]

根据上面的列表可以看出,列表中有整数、字符串、列表和浮点数,甚至还可以把列表当成一个元素。如果刚开始不知道在列表中加些什么的话可以直接创建一个空列表,后续再添加。

  1. >>> empty = []

1.2 向列表添加元素

列表是相对灵活的,所以它的内容不是固定不变的。现在尝试在列表中添加元素,先说第一个方法append()方法:

  1. >>> max = [1,"wolf",[2,4],3.4]

  2. >>> empty = []

  3. >>> max.append(4)

  4. >>> empty.append("wolf")

  5. >>> max

  6. [1, 'wolf', [2, 4], 3.4, 4]

  7. >>> empty

  8. ['wolf']

通过上面的两个例子我们发现添加的元素都加入到列表的末尾了,和BIF内置函数不一样,这个我们在对象里说,这里不做过多的说明。但是我想在列表里加入多个元素需要如何操作呢?这里需要用到extend()。

  1. >>> max.extend([3,4])

  2. >>> max

  3. [1, 'wolf', [2, 4], 3.4, 4, 3, 4]

extend()不管添加多少个元素,都是以列表的形式进行添加,然后排在最后。那么我们想修改某一个元素该如何操作呢?下面看一下insert()方法。insert()方法有两个参数:第一个参数代表在列表中的为知,第二个参数是在这个位置外插入一个元素。下面咱们来试一下:

  1. >>> max

  2. [1, 'wolf', [2, 4], 3.4, 4, 3, 4, 3]

  3. >>> max.insert(2,2)

  4. >>> max

  5. [1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]

等等,上面的insert输入的不是2吗?为什么修改的是第3个元素。是这样的凡是顺序索引,Python均是从0开始的,也是大多数编程语言约定的俗成规范。那么大家知道为什么要用0表示第一个数吗?

是因为计算机原本就是一个二进制的,在二进制的世界不是0就是1两个数:0当然是二进制里的第一个数字了嘛。这就是二进制的世界,所以0也就习惯表示第一个数。

  1. >>> max.insert(0,0)

  2. >>> max

  3. [0, 1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]

1.3 从列表中获取元素

列表和数组一样,都是通过元素的索引值(index)从列表获取单个元素,注意:列表索引值是从0开始的:

  1. >>> max

  2. [0, 1, 'wolf', 2, [2, 4], 3.4, 4, 3, 4, 3]

  3. >>> max[4]

  4. [2, 4]

  5. >>> max[2]

  6. 'wolf'

按照这个方法,我们把两个元素的位置互换一下

  1. >>> max[2], max[4] = max[4],max[2]

  2. >>> max

  3. [0, 1, [2, 4], 2, 'wolf', 3.4, 4, 3, 4, 3]

1.4 从列表删除元素

从列表中删除元素,这里介绍三种方法:remove(),del和pop()删除元素。

  1. >>> max.remove("wolf")

  2. >>> max

  3. [0, 1, [2, 4], 2, 3.4, 4, 3, 4, 3]

使用remove()删除元素,不需要知道元素在列表中的具体位置,只要确定元素在列表中即可,如果删除的元素不在列表中就会报错。

  1. >>> max.remove(5)

  2. Traceback (most recent call last):

  3.  File "<stdin>", line 1, in <module>

  4. ValueError: list.remove(x): x not in list

既然remove()不能利用元素位置删除元素,我们就用del。

  1. >>> del max[2]

  2. >>> max

  3. [0, 1, 2, 3.4, 4, 3, 4, 3]

第二个索引位置原本是一个列表,del是一个语句,不是一个列表的方法,所以你不必在它的后面加一个小括号(),另外,如果想删除整个列表,可以在del后面加列表名;

  1. >>> del max

  2. >>> max

  3. <built-in function max>

最后,我们看一下pop()方法"弹出"元素;

  1. >>> max = [1,"wolf",[2,4],3.4]

  2. >>> max.pop()

  3. 3.4

  4. >>> max

  5. [1, 'wolf', [2, 4]]

使用pop()方法,默认弹出列表的最后一个元素,但是pop()可以灵活应用,只需要给pop()加一个列表的索引值作为参数,就会弹出一个索引值对应的元素。

  1. >>> max.pop(1)

  2. 'wolf'

  3. >>> max

  4. [1, [2, 4]]

1.5 列表分片

利用索引值,可以很方便的从列表中获取一个元素。但是如果想一次获取多个元素,又该如何实现呢?这就用到了列表的分片(slice),可以方便地实现这个要求;

  1. >>> number = [0,1,2,3,4,5,6,7,8,9]

  2. >>> number[0:2]

  3. [0, 1]

Python默认开始位置是从0开始的,所以在切片的时候如果想从0开始可以省略,如果没有放任何的索引值,而只有一个冒号,就会得到整个列表的拷贝。

  1. >>> number[:2]

  2. [0, 1]

  3. >>> number[:]

  4. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果想从最后一位开始切片,那该如何操作呢?下面看一下例子:

  1. >>> number[-3:]

  2. [7, 8, 9]

根据例子可以看出从最后一位开始查找的时候索引值不是从0开始了,那么最后一个索引值从后往前是多少呢?它是如何查找的呢?

  1. >>> number[-1]

  2. 9

  3. >>> number[-4]

  4. 6

  5. >>> number[-4:]

  6. [6, 7, 8, 9]

列表的最后一位的索引值是-1,根据负数计算索引值,以0位基准前面数是正数,后面是负数。列表切片是建立在原列表的一个拷贝(或者说是一个副本),所以如果想对列表做出一些修改,还想保持原来的那个列表,就可以直接用分片的方法获取拷贝就很方便了。

1.6 列表分片的进阶玩法

列表的分片实际上是可以接受三个参数的,其代表的是步长,默认情况下是1,可以改成3看一下是什么效果?

  1. >>> number[0:-1:3]

  2. [0, 3, 6]

从第一个元素到最后一个元素,步长3。也可以这样写:

  1. >>> number[::3]

  2. [0, 3, 6, 9]

前面也有说一个冒号可以打印所有的列表,所以这样也就更简单了。如果步长修改成负数,会怎么样呢?

  1. >>> number[::-1]

  2. [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

负数的步长,就把列表进行反转了。

如果我们在切片的时候取的索引值大于列表的索引会怎么样?

  1. >>> number[10:]

  2. []

有不懂的同学可以自己琢磨一下,这个问题的详细答案我们在后面再解释。

1.7 一些常用的操作符

上一节学到的操作符并不是针对分支,在列表中也可以进行使用,下面看一下几个例子:

  1. >>> list1 = [123]

  2. >>> list2 = [234]

  3. >>> list1 > list2

  4. False

  5. >>> list2 = [234,345]

  6. >>> list1 = [456,123]

  7. >>> list1 > list2

  8. True

看第一个例子的时候可以轻易的看出对比的结果。但是如果列表中有两个元素的时候就有点不太好判断了,第二个例子我们可以看出判断结果,如果换一个例子呢?

  1. >>> list1 = [123,456]

  2. >>> list2 = [234,789]

  3. >>> list1 > list2

  4. False

这样就不好判断了吧,其实列表之间的对比没有你想的那么“智能”(在后面我们会讲如果把列表改变的更聪明)。当列表有多个元素的时候,默认是从第一个元素开始比较的,只要有一个元素大于另一个列表中的元素,第一个列表就大,字符串之间的比较也是一样的,只是字符串自检比较的是根据第一个字符对应的ASCII码的值的大小。

在列表中字符串可以使用(+)进行拼接,可以使用(*)复制自身诺干次。下面看个例子:

  1. >>> list1 = ["Hello"]

  2. >>> list2 = ["Word"]

  3. >>> list1 + list2

  4. ['Hello', 'Word']

加号(+)也叫连接符,它可以把多个列表对象合并在一起,有点类似extend()的效果,一般还是建议使用extend()方法来实现扩展,这样更规范专业一些。连接符只是连接两个对象,不是添加,这个要记得。如果一定要添加可以使用append()或insert()方法进行添加。下面说说使用乘号(*)也叫重复操作符,重复操作符可以在列表中:

  1. >>> list1 = ["Hello"]

  2. >>> list1 * 3

  3. ['Hello', 'Hello', 'Hello']

  4. >>> list1 * = 5

  5. ['Hello', 'Hello', 'Hello', 'Hello', 'Hello']

重复操作符是重复列表中的元素,当然复合赋值运算符也可以用于列表的。记得重复操作符是重复的列表中的元素。

另外在for循环中我们学到的成员关系操作符也可以用于列表,in和not in我们称之为关系操作符!

  1. >>> list = ["wolf","Hello","Word","Python3v"]

  2. >>> "Python3v" in list

  3. True

  4. >>> "Python3" not in list

  5. True

我们在前面学过用列表作为一个列表元素存在列表中,那么如果判断列表中的列表元素能不能使用成员关系in或not in测试呢?试一下看看:

  1. >>> list = [1,2,3,[4,5,6],7,8]

  2. >>> 4 in list

  3. False

  4. >>> 5 not in list

  5. True

例子中我们测试的结果就是只能判断外层的成员关系,这个跟break和continue语句是一样的跳出一个层次的循环是一个道理,如果想判断列表里的列表元素,应该先进一层列表然后再判断:

  1. >>> list = [1,2,3,[4,5,6],7,8]

  2. >>> 4 in list[3]

  3. True

  4. >>> 5 not in list[3]

  5. False

这里说一下,如果获取列表中的列表元素,这个和C语言的是一样的,需要先访问第一层列表然后再访问第二层列表:

  1. >>> list = [1,2,3,[4,5,6],7,8]

  2. >>> list[3][2]

  3. 6

可以看一下,访问第一层的时候也是根据列表的获取是一样的,第二层同样也是,只要是列表,第一个元素永远是0.

1.8 列表的小伙伴们

在Python中有很多关于列表的小伙伴的,我们该如何查看,找到这些小伙伴呢?下面让Python自己告诉我们:

  1. >>> dir(list)

  2. ['__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()这个方法是计算参数在列表中出现的次数的:

  1. >>> list = [1,2,3,4,3,2,3,6,7,3,2]

  2. >>> list.count(3)

  3. 4

这里说一下count()方法计算的是一层的列表,别上次更多层列表就把多层列表也算进去了,可以看下面的例子:

  1. >>> list = [1,2,3,[2,3],5,2]

  2. >>> list.count(3)

  3. 1

index()方法,是返回它的参数在列表中的位置:

  1. >>> list = [1,2,3,[2,3],5,2]

  2. >>> list.count(3)

  3. 1

  4. >>> list.index(3)

  5. 2

  6. >>> list.index(2)

  7. 1

可以看出返回的参数如果有重复返回第一个目标,也只在一层列表中。不过index()方法还有一个两个参数,用于限定查找的范围,因此可以这样查找第二个目标在list的位置。

  1. >>> list = [1,2,1,4,1,6,1,8,1,0]

  2. >>> start = list.index(1) + 1

  3. >>> stop = len(list)

  4. >>> list.index(1,start,stop)

  5. 2

分享到:

发表评论

评论列表