列表是Python中最具灵活性的有序集合对象类型。
列表可以包含任何种类的对象:数字、字符串甚至是其他的列表。
列表是可变对象,它们都支持在原处修改的操作,可以通过指定的偏移值和分片、列表方法调用、删除语句等方法来实现。
基本的列表操作
列表可以使用所有适用于序列的标准操作,例如上面一篇介绍的索引、分片、连接(加)和乘法。除此之外,列表是可以改变的。
本节主要介绍改变列表的方法:元素赋值、元素删除、分片赋值以及列表方法(这里注意,不是所有的列表方法都真正改变列表)。
元素赋值:
使用索引标记来给特定的位置明确的元素赋值。如x[2] = 5
>>> x = [1, 1, 1, 1]
>>> x[2] = 5
>>> x
[1, 1, 5, 1]
>>> x[4] = 4
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
x[4] = 4
IndexError: list assignment index out of range
注意:不能为位置不存在的元素进行赋值。
删除元素:
使用del语句来实现。
>>> names = ['Alice', 'Beth', 'Cecil', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Earl']
‘Cecil'在列表中删除了,而且列表的长度长4变成了3.
>>> num = [1, 2, 3, 4, 5]
>>> del num[3]
>>> num
[1, 2, 3, 5]
分片赋值:
一次为多个列表中的元素赋值。
>>> name = list('louis')
>>> name
['l', 'o', 'u', 'i', 's']
>>> name[1:] = list('Cherish')
>>> name
['l', 'C', 'h', 'e', 'r', 'i', 's', 'h']
>>>
注意:这里'C'替换了'o', 'h'替换了'u', 'e'替换了'i', 'r'替换了's', 除此之外在没有替换任何其他元素的情况下还插入了'i','s', 'h'
可用分片赋值来插入多个值:
>>> num
[1, 5]
>>> num[1 : 1] = [2 , 3, 4]
>>> num
[1, 2, 3, 4, 5]
在第1个索引之后插入一个序列。
可用分片赋值来删除多个元素:
>>> num
[1, 2, 3, 4, 5]
>>> num[1 : 4] = []
>>> num
[1, 5]
用空的分片代替原来的分片,效果就是删除了原分片中的元素。
>>> num
[1, 2, 3, 4, 5]
>>> del num[1:4]
>>> num
[1, 5]
这里小小的复习下前面的负数分片和步长。
>>> num
[1, 2, 3, 4, 5]
>>> del num[-4:-1:2]
>>> num
[1, 3, 5]
>>>
列表方法:
方法是一个与某些对象有紧密联系的函数。
一般来说,方法可以这样调用:
对象.方法(参数)
1. append
在列表末尾添加一个新的对象:
>>> lst = [1, 2, 3, 4, 5, 6]
>>> lst.append(7)
>>> lst
[1, 2, 3, 4, 5, 6, 7]
2. count
计算某个元素在列表中出现的次数:
>>> n = ['to', 'be', 'or', 'not', 'to', 'and']
>>> n.count('to')
2
>>> x = [[1, 2], 1, 3, [4,5], 3, [4,5]]
>>> x.count(3)
2
>>> x.count([4, 5])
2
3. extend
在列表的末尾追加一个序列中的多个值。
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6] 这里a列表被修改
这个操作看起来很像连接操作:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a + b
[1, 2, 3, 4, 5, 6] 返回一个全新的列表>>> a
[1, 2, 3] a列表不变
但两者的区别在于:extend方法修改了被扩展的序列。而原始的连接操作则会返回一个全新的列表。
4. index
找出列表中第一个匹配某个值得索引位置:
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni', 'who']
>>> knights.index('who')
4
>>> knights.index('louis')
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
knights.index('louis')
ValueError: 'louis' is not in list
>>>
当搜索单词‘who’的时候,若‘who’存在于列表中,则返回'who'在列表中第一次出现的索引位置。这里的例子中返回了4.
当搜索单词'louis‘的时候,搜遍整个列表也没找到,就会引发一个异常。
5.insert
insert方法用于将对象插入到列表中:
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3,4)
>>> numbers
[1, 2, 3, 4, 5, 6, 7]
>>>
这里numbers.insert(3, 4)括号中的第一参数是指即将要插入序列的索引位置,第二个参数是要插入的值。
6. pop
pop方法会移除列表中的最后一个元素,并且返回该元素的值:
>>> x = [1, 2, 3, 4]
>>> x.pop()
4
>>> x
[1, 2, 3]
>>> x.pop()
3
>>> x
[1, 2]
>>>
注意:可用append和pop来实现栈。入栈可以使用append方法来代替,出栈可以用pop方法来代替。
注意:pop是唯一一个既能修改列表又返回元素值的列表方法。
7.remove
remove方法用于移除列表中第一个与给定值向匹配的元素:
>>> x = ['T','B','O', 'H', 'M', 'B']
>>> x.remove('B')
>>> x
['T', 'O', 'H', 'M', 'B']>>> x.remove('A')
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
x.remove('A')
ValueError: list.remove(x): x not in list
注意:remove是一个没有返回值但却可改变原位置的方法。
8. reverse
reverse方法将列表中的元素反向存放。
>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]
注意:reverse方法改变了列表却不返回值。
9. sort
sort方法用于在原位置对列表进行排序。在’原位置‘进行排序,意味着改变原来的列表,从而让其中的元素都能按一定的顺序排序,而不是简单的返回一个已排序的列表副本。
>>> x = [4, 6, 2, 1, 9,7]
>>> x.sort()
>>> x
[1, 2, 4, 6, 7, 9]
这里需要举些例子来说明原位置的意思。以下面的为例:
当用户需要一个排好序的列表副本,同时又保留原来列表不变,问题就出现了。
>>> x = [4, 6, 2, 1, 9,7]
>>> y = x.sort()
>>> y
>>> print y
None
这里sort方法修改了x,但是却返回空值,所以这样直接y = x.sort()得到值none.
实现上面所说的正确方法是,先把x的副本复制给y, 然后对y进行排序:
>>> x = [4, 6, 2, 1, 9,7]
>>> y = x[:]
>>> y.sort()
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[4, 6, 2, 1, 9, 7]
y是有序的列表,x列表没变。 实现了上面的用户要求。
注意: 这里用y = x[:]所得到的是包含了x所有元素的分片,是一种很有效率的复制整个列表的方法。只是简单的把x赋值给y是没用的,这只是让x和y指向同一个列表而已:
>>> x = [4, 6, 2, 1, 9,7]
>>> y = x
>>> y.sort()
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[1, 2, 4, 6, 7, 9]
>>>
再介绍一种直接得到列表一排序副本的方法sorted:
>>> x = [4, 6, 2, 1, 9,7]
>>> y = sorted(x)
>>> y
[1, 2, 4, 6, 7, 9]
>>> x
[4, 6, 2, 1, 9, 7]
>>>
方法sorted将列表x的值按从小到大的顺序写进了列表y. 注意,这个函数不改变列表x中值的位置。
这里回到sort, 介绍三个参数。
参数key, 若想列表按字符串长度排序,那么:
>>> x = ['l', 'lakdka', 'adfa', 'dadafgaga']
>>> x.sort(key =len)
>>> x
['l', 'adfa', 'lakdka', 'dadafgaga']
参数reverse, 想让列表逆序排列,那么:
>>> numbers = [5, 2, 9, 7]
>>> numbers.sort(reverse=True)
>>> numbers
[9, 7, 5, 2]