列表与元组

列表与元组

序列

Python内置了多种序列,本章重点讨论其中最常用的两种:列表和元组。另一种重要的序列

是字符串

列表和元组的主要不同在于,列表是可以修改的,而元组不可以。这意味着列表适用于需要

中途添加元素的情形,而元组适用于出于某种考虑需要禁止修改序列的情形。禁止修改序列通常

出于技术方面的考虑,与Python的内部工作原理相关,这也是有些内置函数返回元组的原因所在。

在你自己编写程序时,几乎在所有情况下都可使用列表来代替元组。一种例外情况是将元组用作

字典键,

通用的序列操作

有几种操作适用于所有序列,包括索引、切片、相加、相乘和成员资格检查。另外,Python

还提供了一些内置函数,可用于确定序列的长度以及找出序列中最大和最小的元素。

索引

序列中的所有元素都有编号——从0开始递增。你可像下面这样使用编号来访问各个元素:

>>> greeting = 'Hello' 

>>> greeting[0] 

'H' 

切片

使用切片(slicing)来访问特定范围内的元素。为此,可使用两个索引,并用冒号分隔:

>>> tag = '<a href="http://www.python.org">Python web site</a>' 
>>> tag[9:30] 
'http://www.python.org' 
>>> tag[32:-4] 
'Python web site'

你提供两个索引来指定切片的边界,其中第一个索引指定的元素包含在切片内,但第二个索引指定的元素不包含在切片内。

如果切片结束于序列末尾,可省略第二个索引。

>>> numbers[-3:] 

[8, 9, 10]

同样,如果切片始于序列开头,可省略第一个索引。

>>> numbers[:3] 

[1, 2, 3]

增加步长

>>> numbers[0:10:1] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> numbers[0:10:2] 
[1, 3, 5, 7, 9] 

序列相加

可使用加法运算符来拼接序列。

>>> [1, 2, 3] + [4, 5, 6] 

[1, 2, 3, 4, 5, 6] 

>>> 'Hello,' + 'world!' 

'Hello, world!' 

>>> [1, 2, 3] + 'world!' 

Traceback (innermost last): 

 File "<pyshell>", line 1, in ? 

 [1, 2, 3] + 'world!' 

TypeError: can only concatenate list (not "string") to list 

从错误消息可知,不能拼接列表和字符串,虽然它们都是序列。一般而言,不能拼接不同类型的序列。

乘法

将序列与数x相乘时,将重复这个序列x次来创建一个新序列:

>>> 'python' * 5 

'pythonpythonpythonpythonpython' 

>>> [42] * 10 

[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

成员资格(某个元素是否在序列当中):

要检查特定的值是否包含在序列中,可使用运算符in。这个运算符与前面讨论的运算符(如乘法或加法运算符)稍有不同。它检查是否满足指定的条件,并返回相应的值:满足时返回True,不满足时返回False。这样的运算符称为布尔运算符,而前述真值称为布尔值。

>>> permissions = 'rw' 
>>> 'w' in permissions 
True 
>>> 'x' in permissions 
False 
>>> users = ['mlh', 'foo', 'bar'] 
>>> input('Enter your user name: ') in users 
Enter your user name: mlh 
True 
>>> subject = '$$$ Get rich now!!! $$$' 
>>> '$$$' in subject 
True
长度、最小值和最大值

内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返

回序列中最小和最大的元素

>>> numbers = [100, 34, 678]
>>> len(numbers) 
3
>>> max(numbers) 
678 
>>> min(numbers) 
34
>>> max(2, 3) 
3 
>>> min(9, 3, 2, 5) 
2 

列表

函数list

鉴于不能像修改列表那样修改字符串,因此在有些情况下使用字符串来创建列表很有帮助。

为此,可使用函数list

>>> list('Hello') 
['H', 'e', 'l', 'l', 'o']

基本列表操作

1.修改列表,给元素赋值

修改列表很容易,只需使用第1章介绍的普通赋值语句即可,但不是使用类似于x = 2这样的

赋值语句,而是使用索引表示法给特定位置的元素赋值,如x[1] = 2。

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']

列表方法

方法是与对象(列表、数、字符串等)联系紧密的函数。通常,像下面这样调用方法:

object.method(arguments)

方法调用与函数调用很像,只是在方法名前加上了对象和句点

1.append

方法append用于将一个对象附加到列表末尾。

>>> lst = [1, 2, 3] 
>>> lst.append(4) 
>>> lst 
[1, 2, 3, 4]
2.clear

方法clear就地清空列表的内容。

>>> lst = [1, 2, 3] 
>>> lst.clear() 
>>> lst 
[]

3.copy

方法 copy 复制列表。前面说过,常规复制只是将另一个名称关联到列表。

>>> a = [1, 2, 3] 
>>> b = a 
>>> b[1] = 4 
>>> a 
[1, 4, 3] 

实际上,从Python 2.2起,list就是类型,而不是函数了(tuple和str亦如此)。有关这方面的完整说明

4.count

方法count计算指定的元素在列表中出现了多少次。

>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to') 
2 
>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 
>>> x.count(1) 
2 
>>> x.count([1, 2]) 
1 
5.extend

方法extend让你能够同时将多个值附加到列表末尾,为此可将这些值组成的序列作为参数提

供给方法extend。换而言之,你可使用一个列表来扩展另一个列表。

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> a.extend(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]

与extend一样,也可使用切片赋值来获得与insert一样的效果。

>>> numbers = [1, 2, 3, 5, 6, 7] 
>>> numbers[3:3] = ['four'] 
>>> numbers 
[1, 2, 3, 'four', 5, 6, 7

这虽巧妙,但可读性根本无法与使用insert媲美。

8.pop

方法pop从列表中删除一个元素(末尾为最后一个元素),并返回这一元素。

>>> x = [1, 2, 3] 
>>> x.pop() 
3 
>>> x 
[1, 2] 
>>> x.pop(0) 
1 
>>> x 
[2]
9.remove

方法remove用于删除第一个为指定值的元素。

>>> x = ['to', 'be', 'or', 'not', 'to', 'be'] 
>>> x.remove('be') 
>>> x 
['to', 'or', 'not', 'to', 'be'] 
>>> x.remove('bee')

请注意,remove是就地修改且不返回值的方法之一。不同于pop的是,它修改列表,但不返回任何值。

10.reverse

方法reverse按相反的顺序排列列表中的元素

>>> x = [1, 2, 3] 
>>> x.reverse() 
>>> x 
[3, 2, 1]
11.sort

方法sort用于对列表就地排序①。就地排序意味着对原来的列表进行修改,使其元素按顺序

排列,而不是返回排序后的列表的副本。

>>> x = [4, 6, 2, 1, 7, 9] 
>>> x.sort() 
>>> x 
[1, 2, 4, 6, 7, 9]
12.高级排序

方法sort接受两个可选参数:key和reverse。这两个参数通常是按名称指定的,称为关键字参数,将在第6章详细讨论。参数key类似于参数cmp:你将其设置为一个用于排序的函数。然而,不会直接使用这个函数来判断一个元素是否比另一个元素小,而是使用它来为每个元素创建一个键,再根据这些键对元素进行排序。因此,要根据长度对元素进行排序,可将参数key设置为函数len

>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate'] 
>>> x.sort(key=len) 
>>> x 
['add', 'acme', 'aerate', 'abalone', 'aardvark']

对于另一个关键字参数reverse,只需将其指定为一个真值(True或False),以指出是否要按相反的顺序对列表进行排序。

>>> x = [4, 6, 2, 1, 7, 9] 
>>> x.sort(reverse=True) 
>>> x 
[9, 7, 6, 4, 2, 1]

函数sorted也接受参数key和reverse。在很多情况下,将参数key设置为一个自定义函数很有用。

元组

列表一样,元组也是序列,唯一的差别在于元组是不能修改的

元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。元组并不太复杂,而且除创建和访问其元素外,可对元组执行的操作不多。元组的创建及其元素的访问方式与其他序列相同。元组的切片也是元组,就像列表的切片也是列表一样。

 它们用作映射中的键(以及集合的成员),而列表不行。

 有些内置函数和方法返回元组,这意味着必须跟它们打交道。只要不尝试修改元组,与元组“打交道”通常意味着像处理列表一样处理它们(需要使用元组没有的index和count等方法时例外)。

一般而言,使用列表足以满足对序列的需求。

posted @ 2021-03-05 11:09  (◓3◒)  阅读(217)  评论(0)    收藏  举报