在Python中,最基本的数据结构为序列(sequence)。序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推。同时可回绕到序列末尾,用负索引表示序列末尾元素的位置。本章介绍一些通用的操作。
2.1 序列概述
列表和元组的主要不同在于,列表是可以修改的,而元组不可以。
列表中,所有元素都放在方括号内,并用逗号隔开。类似于其他语言的数组了。序列中还可以包含其他序列。
2.2 通用的序列操作
2.2.1 索引
序列中的所有元素都有编号——从0开始递增。
>>> greeting = 'Hello'
>>> greeting[0]
H
字符串就是由字符组成的序列。不同于其他一些语言,Python没有专门用于表示字符的类型,因此一个字符就是只包含一个元素的字符串。
当使用负数索引时,Python将从右往左数,-1是最后一个元素的位置。
对于字符串字面量(以及其他的序列字面量) ,可直接对其执行索引操作,无需先将其赋给变量。这与先赋给变量再对变量执行索引操作的效果是一样的。
>>>'Hello'[1]
'e'
2.2.2 切片
切片可以访问特定范围内的元素。切片使用两个索引,并用冒号分隔。区间是左闭右开。
如果第一个索引指定的元素位于第二个索引指定的元素后面,结果就为空序列。即使index越界也不报错,只返回空序列。
一种简写:如果切片结束于序列末尾,可省略第二个索引;如果切片始于序列开头,可省略第一个索引。要复制整个序列,可将两个索引都省略。
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[-3:]
[8, 9, 10]
>>> numbers[:3]
[1, 2, 3]
>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
切片操作中有另一个参数,即步长。普通切片中步长为1,如果指定步长大于1,可以跳过一些元素。步长不能为0,但可以为负数,即从右向左提取元素。步长为负数时,第一个索引必须比第二个索引大。
2.2.3 序列相加
可使用加法运算符来拼接序列。一般而言,不能拼接不同类型的序列。
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello, world!'
# >>> [1, 2, 3] + 'world!' 不能拼接
>>> [1,'hello']+['world']
[1, 'hello', 'world']
2.2.4 乘法
将序列与数x相乘时,将重复这个序列x次来创建一个新序列。
空列表是使用不包含任何内容的两个方括号[]
表示的。None表示什么都没有(None必须是大写)。
要将列表的长度初始化为10,可像下面这样做:
>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
2.2.5 成员资格
要检查特定的值是否包含在序列中,可使用运算符in。返回值为布尔值。
字符串的检查也可以用in,且单独字符和子串都可以用于判断。
内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素。
2.3 列表:Python 的主力
2.3.1 函数 list
为此,可使用函数list创建字符串的列表。
>>> list('Hello')
['H', 'e', 'l', 'l', 'o']
2.3.2 基本的列表操作
1.修改列表:给元素赋值
修改列表可以用普通赋值语句直接给指定索引位置元素赋值。
2.删除元素
使用del语句
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']
3.给切片赋值
通过切片可以同时给多个元素赋值,并且可以将切片帖换位为长度与其不同的序列
>>> name = list('Perl')
>>> name ['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
使用切片赋值还可在不替换原有元素的情况下插入新元素。也可以反过来删除切片。
>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = []
>>> numbers
[1, 5]
2.3.3 列表方法
1.append
方法append用于将一个对象附加到列表末尾
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
append直接修改原有列表,不会返回创建新列表。
2.clear
方法clear就地清空列表的内容。这类似于切片赋值语句lst[:] = []。
3.copy
方法copy复制列表。常规复制只是将另一个名称关联到列表。copy类似于使用a[:]或list(a),它们也都复制。
>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 4
>>> a
[1, 4, 3]
>>> b = a.copy()
>>> b[1] = 2
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]
>>> c = b[:]
>>> c[1] = 4
>>> c
[1, 4, 3]
>>> b
[1, 2, 3]
4.count
方法count计算指定的元素在列表中出现了多少次。
>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1
5.extend
方法extend让你能够同时将多个值附加到列表末尾。类似于列表拼接,但是常规拼接是返回一个新的序列。
常规拼接必须使用a和b的副本创建一个新列表,因此如果你要获得类似于下面的效果,拼接的效率将比extend低。
>>> a = a + b
以下方法虽然可行,但是可读性不高。
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a[len(a):] = b
>>> a
[1, 2, 3, 4, 5, 6]
6.index
方法index在列表中查找指定值第一次出现的索引。
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>> knights.index('who')
4
7.insert
方法insert用于将一个对象插入列表。
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
8.pop
方法pop从列表中删除一个元素(末尾为最后一个元素),并返回这一元素。
pop是唯一既修改列表又返回一个非None值的列表方法。
>>> x = [1, 2, 3]
>>> x.pop()
3
>>> x [1, 2]
>>> x.pop(0)
1
>>> x
[2]
append和pop可以实现栈
insert(0,...)替代append可以实现队列
append和pop(0)也可以。更好的解决方案是使用collections中的deque。
9.remove
方法remove用于删除第一个为指定值的元素。
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
10.reverse
方法reverse按相反的顺序排列列表中的元素。reverse修改列表,但不返回任何值(与remove和sort等方法一样)。
11.sort
方法sort用于对列表就地排序。
函数sorted返回值是一个列表。
12.高级排序
方法sort接受两个可选参数:key和reverse。
>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
>>> x.sort(key=len)
>>> x
['add', 'acme', 'aerate', 'abalone', 'aardvark']
对于另一个关键字参数reverse, 只需将其指定为true,以指出是否要按相反的顺序对列表进行排序。
>>> x = [4, 6, 2, 1, 7, 9]
>>> x.sort(reverse=True)
>>> x
[9, 7, 6, 4, 2, 1]
2.4 元组:不可修改的序列
与列表一样,元组也是序列,唯一的差别在于元组是不能修改的。(字符串也不能修改)
元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。元组还可用圆括号括起(这也是通常采用的做法)。
>>> 1, 2, 3
(1, 2, 3)
>>> (1, 2, 3)
(1, 2, 3)
空元组用两个不包含任何内容的圆括号表示。
>>> ()
()
一个值的元组需要在值后加逗号。
>>> 42,
(42,)
函数tuple的工作原理与list很像:它将一个序列作为参数,并将其转换为元组。如果参数已经是元组,就原封不动地返回它。