作者:禅与计算机程序设计艺术
1.背景介绍
Python的列表和元组都是非常重要的数据结构。列表和元组都是用来存储多个数据元素的容器。但是,二者之间的差异还是比较大的。本文将对比分析两者之间的特性、功能及应用场景,并结合具体案例,带领读者熟悉并掌握列表和元组的基本用法。
首先,先来看下列表和元组之间的区别。
- 列表(list):
- 是一种有序集合;
- 可以存储重复的对象;
- 列表中的元素可以通过索引进行访问、添加和删除;
- 列表是可变的,因此可以动态地添加或者删除元素;
- 使用方括号[]表示列表。例如:[1, ‘hello’, [True, False]]。
- 元组(tuple):
- 是一个不可变的有序集合;
- 不可修改它的元素,只能读取;
- 元组中的元素不能被修改或增加;
- 使用圆括号()表示元组。例如:(‘apple’, 3.14, True) 。
由此可见,列表和元组在很多方面都有所不同。
2.核心概念与联系
- 序列(sequence):数据项的集合,具有固定顺序,其中每个元素都有一个唯一的标识符。序列包括字符串、列表、元组、集合等。
- 可变性(mutability):序列是否可以改变,换言之,序列是否可以修改其中的元素?例如,字符串序列可以更改,而列表序列则不可以。
- 下标(index):序列中每一个元素都有对应的唯一的标识符,这个标识符称作下标。
- 分片(slicing):通过指定起始和终止位置,能够从序列中取出一部分元素。分片语法形式为:
start:stop:step,参数都可以省略,默认值分别为0、最后一个元素下标+1、1。例如my_list[0:3]会从序列my_list中截取元素的子集,从第0个元素到第三个元素。 - 拆包(unpacking):指在赋值语句中,把一个序列的值拆成多变量赋值,例如
a, b = (1, 2)。拆包只适用于元组、列表和字符串。 - 迭代器(iterator):能够访问序列中的元素,但一次只能获取单个元素。迭代器可以用for循环遍历序列,或者用next方法获取序列的下一个元素。
- 生成器表达式(generator expression):生成器表达式可以创建迭代器,语法与列表解析类似。生成器表达式可以节省内存空间,因为它不需要保存整个序列。
3.核心算法原理和具体操作步骤以及数学模型公式详细讲解
创建列表
创建空列表
创建空列表的方式如下:
empty_list = [] # 创建空列表
创建一个包含0个元素的列表,如下所示:
zero_list = list()
print(type(zero_list)) # <class 'list'>
print(len(zero_list)) # 0
创建包含1个元素的列表,如下所示:
one_list = ['hello']
print(type(one_list)) # <class 'list'>
print(len(one_list)) # 1
创建包含多个元素的列表,如下所示:
many_list = ['apple', 'banana', 'orange', 'grape']
print(type(many_list)) # <class 'list'>
print(len(many_list)) # 4
通过数字创建列表
如果要从数字0开始创建列表,可以使用内置函数range()和map(),如下所示:
num_list = list(map(str, range(10)))
print(num_list) # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
也可以直接使用列表推导式,如下所示:
num_list = [str(i) for i in range(10)]
print(num_list) # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
还可以设置步长,比如每隔两个元素取一个值,即步长为2,如下所示:
two_list = list(map(str, range(0, 10, 2)))
print(two_list) # ['0', '2', '4', '6', '8']
从字符串或其它序列类型创建列表
如果要从其他序列类型如字符串或元组等创建列表,可以使用以下方式:
string_list = list("Hello World")
print(string_list) # ['H', 'e', 'l', 'l', 'o','', 'W', 'o', 'r', 'l', 'd']
tuple_list = list(('apple', 3.14, True))
print(tuple_list) # ['apple', 3.14, True]
这样就能很方便地从字符串或元组创建列表了。
将列表转换为元组
使用tuple()函数将列表转换为元组,如下所示:
old_list = ["apple", "banana", "orange"]
new_tuple = tuple(old_list)
print(new_tuple) # ('apple', 'banana', 'orange')
这样就完成了列表到元组的转换。
获取元素
获取列表中的特定元素
列表中的元素可以通过索引进行访问,索引从0开始计数,并且可以支持负数索引,以表示倒数第几个元素。
fruits = ['apple', 'banana', 'orange']
print(fruits[0]) # apple
print(fruits[-1]) # orange
如果索引超出了范围,会报IndexError异常。
切片操作
列表支持切片操作,返回一个新的列表,包含指定范围的元素。语法形式为list[start:end:step],其中start、end和step均为可选参数。如果省略start,默认为0;如果省略end,默认为序列末尾元素下标+1;如果省略step,默认为1。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sub_list = numbers[2:8:2] # 从第三个元素到第八个元素(不包括),每隔两个元素取一个值
print(sub_list) # [3, 5, 7]
可以用切片操作去掉列表头部或尾部的元素,例如:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
new_list = fruits[1:-1] # 去掉第一个元素和最后一个元素
print(new_list) # ['banana', 'orange', 'grape']
迭代器操作
可以使用for循环和next()方法遍历列表中的元素,这种方式称作迭代器操作。
colors = ['red', 'green', 'blue', 'yellow']
for color in colors:
print(color)
输出结果:
red
green
blue
yellow
还可以使用迭代器操作获取列表中的元素,如下所示:
colors = ['red', 'green', 'blue', 'yellow']
it = iter(colors) # 创建迭代器
while True:
try:
color = next(it) # 获取下一个元素
print(color)
except StopIteration:
break # 没有更多的元素时退出循环
输出结果:
red
green
blue
yellow
添加元素
在列表末尾添加元素
使用append()方法可以在列表末尾添加一个元素,如下所示:
fruits = ['apple', 'banana', 'orange']
fruits.append('grape')
print(fruits) # ['apple', 'banana', 'orange', 'grape']
插入元素
使用insert()方法可以在任意位置插入一个元素,如下所示:
fruits = ['apple', 'banana', 'orange']
fruits.insert(1, 'grape') # 在第二个元素之前插入'grape'
print(fruits) # ['apple', 'grape', 'banana', 'orange']
删除元素
删除列表中所有元素
使用clear()方法可以清空列表中的所有元素,如下所示:
fruits = ['apple', 'banana', 'orange']
fruits.clear()
print(fruits) # []
删除列表中特定元素
使用remove()方法可以删除列表中指定的元素,如下所示:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
fruits.remove('banana')
print(fruits) # ['apple', 'orange', 'grape', 'pear']
remove()方法只删除第一次出现的元素,如果需要删除其他元素,需要使用while循环配合pop()方法,如下所示:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
while 'orange' in fruits: # 如果存在orange元素,则删除
fruits.remove('orange')
print(fruits) # ['apple', 'grape', 'pear']
根据值删除元素
使用del语句可以根据值的位置删除元素,如下所示:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
del fruits[1] # 删除第二个元素
print(fruits) # ['apple', 'orange', 'grape', 'pear']
也可以通过遍历列表来查找并删除特定元素,如下所示:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
to_delete = 'orange'
if to_delete in fruits: # 查找元素是否存在
index = fruits.index(to_delete)
del fruits[index] # 删除元素
print(fruits) # ['apple', 'banana', 'grape', 'pear']
修改元素
替换元素
使用replace()方法可以替换列表中的特定元素,如下所示:
fruits = ['apple', 'banana', 'orange', 'grape', 'pear']
fruits.replace('orange', 'watermelon')
print(fruits) # ['apple', 'banana', 'watermelon', 'grape', 'pear']
replace()方法仅替换列表中第一次出现的元素。
更新列表
使用update()方法可以更新列表,如下所示:
old_list = ['apple', 'banana', 'orange']
new_list = ['pear', 'pineapple', 'grape']
old_list.update(new_list) # 把new_list的内容加入到old_list中
print(old_list) # ['apple', 'banana', 'orange', 'pear', 'pineapple', 'grape']
update()方法不会修改old_list,而是返回一个新的列表。
对列表排序
sort()方法
sort()方法可以对列表进行升序排序,如下所示:
unsorted = [5, 2, 8, 3, 9, 1]
unsorted.sort() # 对unsorted列表进行升序排序
print(unsorted) # [1, 2, 3, 5, 8, 9]
如果要反转排序方向,可以使用reverse=True参数,如下所示:
unsorted = [5, 2, 8, 3, 9, 1]
unsorted.sort(reverse=True)
print(unsorted) # [9, 8, 5, 3, 2, 1]
sorted()函数
sorted()函数可以创建并返回一个新列表,包含原列表的排序版本。sort()方法只是在原列表上修改,而sorted()函数总是返回一个新的列表,包含原列表的排序版本。
unsorted = [5, 2, 8, 3, 9, 1]
sorted_list = sorted(unsorted)
print(sorted_list) # [1, 2, 3, 5, 8, 9]