Skip to main content

列表和元组

初始化

Python 的列表与 JavaC 等其他语言的数组非常相似,是对象的有序集合。

x = [1, 2, 3]
info

与很多其他语言的列表不同,Python 的列表可以包含不同类型的元素,列表元素可以是任意的 Python 对象。

tip

len() 函数返回列表的元素数量。

索引

Python 从 0 开始计数,索引为 0 将返回列表的第一个元素,索引为 1 则返回第二个元素,依此类推。

>>> x = ["first", "second", "third", "fourth"]
>>> x[0]
'first'
>>> x[2]
'third'
tip

如果索引为负数,表示从列表末尾开始计数的位置,其中 -1 是列表的最后位置,-2 是倒数第二位,依此类推。

切片

就像索引可以从列表中取得单个值一样,切片 可以从列表中取得多个值,结果是一个新列表。

list[index1:index2]
info

提取 index1(含)和上限至 index2(不含)之间的所有数据项,并放入一个新列表中。

>>> x = ["first", "second", "third", "fourth"]
>>> x[1:-1]
['second', 'third']
>>> x[0:3]
['first', 'second', 'third']
>>> x[-2:-1]
['third']
tip

在对列表进行切片时,还可以省略 index1index2。省略 index1 表示“从列表头开始”,而省略 index2 则表示“直到列表末尾为止”。如果两个索引都省略了,将会由原列表从头至尾创建一个新列表,即列表复制。

修改

>>> x = [1, 2, 3, 4]
>>> x[1] = "two"
>>> x
[1, 'two', 3, 4]

append

向列表添加单个元素。

>>> x = [1, 2, 3]
>>> x.append("four")
>>> x
[1, 2, 3, 'four']

extend

将列表追加到另一个列表之后。

>>> x = [1, 2, 3, 4]
>>> y = [5, 6, 7]
>>> x.extend(y)
>>> x
[1, 2, 3, 4, 5, 6, 7]
相同效果的切片操作
>>> x = [1, 2, 3, 4]
>>> x[len(x):] = [5, 6, 7]
>>> x
[1, 2, 3, 4, 5, 6, 7]

insert

可以在两个现有元素之间或列表之前插入新的元素。

>>> x = [1, 2, 3]
>>> x.insert(2, "hello")
>>> print(x)
[1, 2, 'hello', 3]
tip

当 n 是非负值时,list.insert(n, elem)list[n:n] = [elem] 的效果是一样的。

del

删除列表数据项。

>>> x = ['a', 2, 'c', 7, 9, 11]
>>> del x[1]
>>> x
['a', 'c', 7, 9, 11]
>>> del x[:2]
>>> x
[7, 9, 11]
tip

通常,del list[n] 的功能与 list[n:n+1] = [] 是一样的,而 del list[m:n] 的功能则与 list[m:n] = [] 相同。

remove

在列表中查找给定值的第一个实例,然后将该值从列表中删除。

>>> x = [1, 2, 3, 4, 3, 5]
>>> x.remove(3)
>>> x
[1, 2, 4, 3, 5]
caution

如果 remove 找不到要删除的的值,就会引发错误。可以用 Python 的异常处理机制来捕获错误,也可以在做 remove 之前,先用 in 检查一下要删除的值是否存在,以避免错误的发生。

reverse

列表逆序。

>>> x = [1, 3, 5, 6, 7]
>>> x.reverse()
>>> x
[7, 6, 5, 3, 1]

排序

sort

>>> x = [3, 8, 4, 0, 2, 1]
>>> x.sort()
>>> x
[0, 1, 2, 3, 4, 8]
caution

sort 方法可以对任何对象进行排序,因为 Python 几乎可以对任何对象进行比较。但是在排序时有一点需要注意:sort 用到的默认键方法要求,列表中所有数据项均为可比较的类型。这意味着,如果列表同时包含数字和字符串,那么使用 sort 方法将会引发异常!

自定义排序

定义函数,按照每个单词的字符数对单词列表进行排序。

def compare_num_of_chars(string1):
return len(string1)

>>> word_list = ['Python', 'is', 'better', 'than', 'C']
>>> word_list.sort(key=compare_num_of_chars)
>>> print(word_list)
['C', 'is', 'than', 'Python', 'better']

sorted

info

列表内置了排序方法,但 Python 的其他可迭代对象(如字典的键),就没有 sort 方法。Python 还内置有 sorted() 函数,能够从任何可迭代对象返回有序列表。和列表的 sort 方法一样,sorted() 函数同样也用到了参数 keyreverse

>>> x = (4, 3, 1, 2)
>>> y = sorted(x)
>>> y
[1, 2, 3, 4]
>>> z = sorted(x, reverse=True)
>>> z
[4, 3, 2, 1]

常用方法

方法说明示例
[]创建空列表x = []
len返回列表长度len(x)
append在列表末尾添加一个元素x.append('y')
extend在列表末尾添加另一个列表x.extend(['a', 'b'])
insert在列表的指定位置插入一个新元素x.insert(0, 'y')
del删除一个列表元素或切片del(x[0])
remove检索列表并移除给定值x.remove('y')
reverse原地将列表逆序x.reverse()
sort原地对列表排序x.sort()
+将两个列表拼接在一起x1 + x2
*将列表复制多份x = ['y'] * 3
min返回列表中的最小元素min(x)
max返回列表中的最大元素max(x)
index返回某值在列表中的位置x.index['y']
count对某值在列表中出现的次数计数x.count('y')
sum对列表数据项计算合计值(如果可以合计的话)sum(x)
in返回某数据项是否为列表的元素'y' in x

元组

元组是与列表非常相似的数据结构。但是元组只能创建,不能修改。

单个元素的元组应加上逗号

>>> x = 3
>>> y = 4
>>> (x + y) # 此行代码将把 x 和 y 相加
7
>>> (x + y,) # 跟了逗号就意味着,圆括号是用来标识元组的
(7,)
>>> () # 用成对的空的圆括号创建一个空元组
()

打包和拆包

Python 允许元组出现在赋值操作符的左侧,这时元组中的变量会依次被赋予赋值操作符右侧元组的元素值。

>>> (one, two, three, four) = (1, 2, 3, 4)
>>> one
1
>>> two
2

可以简写为:

one, two, three, four = 1, 2, 3, 4
交换变量
temp = var1
var1 = var2
var2 = temp

可简写为:

var1, var2 = var2, var1

列表和元组的相互转换

>>> list((1, 2, 3, 4))
[1, 2, 3, 4]
>>> tuple([1, 2, 3, 4])
(1, 2, 3, 4)
利用 list,很容易就能将字符串拆分为字符
>>> list("Hello")
['H', 'e', 'l', 'l', 'o']