Python 列表(List)
Python 列表(List)
你刚学会整理自己的书包的时候,你会把课本、笔记本、铅笔盒都放在里面,它们虽然各不相同,但都被整齐地收纳在一起,方便你随时取用。在 Python 中,列表 就扮演了类似书包或者说数据收纳盒的角色
一、什么是序列?列表从哪里来?
在 Python 中,有一类非常基础和重要的数据结构,我们称之为 **序列 (Sequence)**。你可以把序列理解成一种排列方式。它把多个数据元素按照一定的顺序一个挨着一个地排起来
Python 中有好几种内置的序列类型,就像书包有不同的款式,比如双肩包、单肩包。在这些序列类型中,列表 (List) 和 元组 (Tuple) 是我们最最常用的两种。而今天,我们的主角就是列表 (List)
二、列表能做什么?基本操作初体验
既然列表是收纳盒,那我们就来看看这个收纳盒能帮我们做些什么基础的事情:
索引 (Indexing):找到特定位置的元素
- 你的书包里,第一格放课本,第二格放笔记本。第几格就是一种简单的索引
- 在 Python 列表中,每个元素也都有自己的位置编号,我们称之为 索引。
- 需要注意的是,Python 列表的索引是从
0开始的! 也就是说,第一个元素的索引是0,第二个是1,以此类推。
切片 (Slicing):获取一部分元素
- 如果你想从书包里拿出“从第二格到第四格”的所有东西,这就类似列表的切片操作。
- 切片就是从列表中切出连续的一部分元素,形成一个新的列表。
拼接 (Concatenation):把两个列表连起来
- 你有一个小盒子装铅笔,一个小盒子装橡皮,现在想把它们的东西合并到一个大盒子里,这就类似列表的拼接。
- 我们可以用
+号把两个列表“加”起来,形成一个包含了两个列表所有元素的新列表。
重复 (Repetition):让列表内容重复出现
- 如果你想在书包里放 3 本一模一样的练习本,列表的重复操作就能帮你快速实现。
- 我们可以用
*号让一个列表里的所有元素重复若干次,形成一个新的列表。
检查成员 (Membership Check):判断元素是否在列表中
- 你想知道书包里有没有带橡皮,就会翻一翻看看。
- 对于列表,我们可以很方便地检查某个元素是不是在这个列表里面。
除了这些,Python 还为我们提供了一些内置的小工具来操作列表,比如
- **确定序列的长度 (Length)**。数一数你的书包里一共有多少件东西
- **找出最大和最小的元素 (Max & Min)**。在一堆数字中,快速找到最大的那个和最小的那个
三、创建你的第一个列表
列表的模样,列表通常写在一对 方括号 [] 里面,列表中的元素之间用 逗号 , 分隔开
列表的特点,列表里面放的元素,也叫数据项。不需要是同一种类型!你可以在一个列表里放数字、文字、甚至以后我们会学到的其他复杂对象
看几个例子,你就明白了:
1 | # 例子 1:一个包含字符串和数字的列表 |
在上面的代码中,list1、list2、list3 就是我们创建的三个列表变量。我们用赋值符号 = 把右边创建好的列表“装”进了这些变量里。
就像我们前面说的,列表的索引也是从 0 开始,所以 list2 中的第一个元素 1 的索引就是 0,2 的索引就是 1,依此类推。
四、访问列表中的值
现在,最关键的问题是:怎么从这个收纳盒里拿出我们想要的特定物品?
4.1 索引 (Indexing)
还记得我们说过,列表里的元素是按顺序排好队的吗?就像电影院的座位一样,每个座位都有自己的号码。列表里的每个元素也有一个唯一的座位号,我们称之为 “索引 (Index)”。通过这个索引,我们就能精确地找到并取出对应位置的元素。
最最重要的规则(敲黑板!):
在 Python 的列表中,第一个元素的索引是 0,而不是 1! 第二个元素的索引是 1,第三个是 2,以此类推。
格式:
要访问列表中的某个元素,我们使用 列表名 后面跟一个 **方括号 []**,方括号里面写上该元素的 索引值。
1 | 列表名[索引值] |
动手试一试:
1 | # 我们先创建一个列表 |
你觉得会输出什么呢?
运行上面的代码,你会看到:
1 | list1[0]: physics |
是不是和你想的一样?list1[0] 就是取 list1 的第一个元素 'physics',list2[1] 就是取 list2 的第二个元素 2。
4.2 切片 (Slicing)
有时候,我们不仅仅想取出单个元素,可能想一下子取出列表中某一段连续的元素,比如从第2个到第5个。这时候,切片 (Slicing) 操作就非常有用了!
切片就像是用一把小刀,从列表这个大蛋糕上,切下其中的一小块。
格式:
切片的格式是在方括号中使用冒号 : 来分隔起始索引和结束索引:
1 | 列表名[起始索引 : 结束索引] |
- 起始索引 (start): 表示从这个索引开始取(包含这个索引的元素)。
- 结束索引 (end): 表示取到这个索引之前结束(不包含这个索引的元素)。
动手试一试:
我们还用上面的 list2 = [1, 2, 3, 4, 5, 6, 7]
1 | # 假设我们想取出 list2 中,从索引 1 到索引 5 之前的元素 |
思考一下:list2 的元素和对应的索引是:
元素: 1, 2, 3, 4, 5, 6, 7
索引: 0, 1, 2, 3, 4, 5, 6
list2[1:5] 表示从索引 1 (元素 2) 开始,取到索引 5 之前结束。索引 5 对应的元素是 6,所以不包含 6。那么取到的就是索引 1,2,3,4 对应的元素 2,3,4,5。
运行结果:
1 | list2[1:5]: [2, 3, 4, 5] |
完美!和我们分析的一样。
切片的小秘密:
- 如果 起始索引 省略(即
list2[:5]),表示从列表的开头(索引0)开始取,直到结束索引之前。 - 如果 结束索引 省略(即
list2[1:]),表示从起始索引开始取,一直取到列表的末尾(包含最后一个元素)。 - 如果两者都省略(即
list2[:]),则表示取整个列表(会创建一个原列表的副本)。
比如:
1 | print("list2[:3]: ", list2[:3]) # 从开头取到索引3之前:元素 1,2,3 |
输出会是:
1 | list2[:3]: [1, 2, 3] |
五、更新列表
我们的收纳盒不是一成不变的。有时候我们想把里面的旧东西换成新的,有时候我们想往里面再加点新东西。Python 列表很灵活,支持这些操作
5.1 修改列表中的元素
如果你想把列表中某个位置的元素换成另一个元素,非常简单,就像给那个位置重新赋值一样。
格式:
1 | 列表名[要修改元素的索引] = 新的值 |
动手试一试:
1 | # 假设我们有一个列表,记录一些水果 |
看,通过指定索引,我们轻松地把 '梨' 改成了 '葡萄'!
5.2 添加列表项
如果我们想在列表的 末尾 再添加一个新的元素,append() 方法就是我们的好帮手。
什么是方法 (Method)?
你可以暂时把方法理解成 列表自带的一个小功能或者小工具。append() 这个工具的功能就是在列表的最后面追加一个元素。
格式:
1 | 列表名.append(要添加的新元素) |
动手试一试:
1 | # 我们先来创建一个空列表(里面什么都没有) |
是不是很神奇?一个空列表,通过 append() 方法,我们一步步给它添加了新元素。append() 总是把新元素放在列表的最后面。
小贴士:append() 方法非常常用,记得它是 在列表末尾添加。会在后续章节中详细介绍更多列表的方法。
六、删除列表元素
有时候,列表里的某些元素可能过时了,或者我们不小心放错了东西,这时候就需要把它们从列表中删除。Python 提供了多种方式来删除列表元素,我们先来学习最直接的一种:使用 del 语句。
6.1 使用 del 语句删除元素
del 是 Python 中的一个关键字,它的功能之一就是删除变量或者数据结构中的元素。对于列表,我们可以用 del 语句配合 索引 来删除列表中指定位置的元素。
格式:
1 | del 列表名[要删除元素的索引] |
动手试一试:
1 | # 我们有一个列表 |
过程解析:
- 原始列表
list1是['physics', 'chemistry', 1997, 2000] - 元素
'physics'的索引是 0,'chemistry'是 1,1997是 2,2000是 3。 - 我们执行
del list1[2],就是明确告诉 Python:“请删除list1中索引为 2 的那个元素。” - 于是,
1997就被从列表中移除了。剩下的元素会自动往前靠拢,填补空缺。所以删除后,2000的索引就变成了 2。
6.2 更多删除方法预告:remove() 方法
除了用 del 语句根据索引删除,Python 列表还有其他删除元素的方法。比如,我们后面会学到的 remove() 方法。remove() 方法可以直接根据 元素的值 来删除,而不是索引。
例如,如果你知道列表里有一个元素叫 'apple',但不确定它在哪个位置,就可以用 remove('apple') 来尝试删除它。
我们会在后续的章节中详细讨论 remove() 方法以及其他相关方法(比如 pop())的使用。
七、Python 列表脚本操作符
列表虽然是收纳盒,但它也支持一些类似数字或字符串的运算操作。这些操作符能让我们更方便地操作列表。
7.1 + 号:组合列表(列表拼接)
+ 号(加号)可以把两个列表“拼接”在一起,形成一个新的列表。原来的两个列表不会发生改变。
就像把两个小收纳盒里的东西倒在一起,组成一个新的大收纳盒。
| Python 表达式 | 结果 | 描述 |
|---|---|---|
[1, 2, 3] + [4, 5, 6] |
[1, 2, 3, 4, 5, 6] |
将两个列表组合成一个新列表 |
动手试一试:
1 | list_a = [1, 2, 3] |
7.2 * 号:重复列表
* 号可以让列表中的所有元素重复指定的次数,形成一个新的列表。
就像你有一个模板,然后复制粘贴了好几次。
| Python 表达式 | 结果 | 描述 |
|---|---|---|
['Hi!'] * 4 |
['Hi!', 'Hi!', 'Hi!', 'Hi!'] |
将列表中的元素重复4次 |
动手试一试:
1 | greeting = ['Hi!'] |
7.3 len() 函数
len() 是一个内置函数,它可以告诉我们列表中一共有多少个元素,也就是列表的长度。
| Python 表达式 | 结果 | 描述 |
|---|---|---|
len([1, 2, 3]) |
3 |
列表中元素的个数 |
动手试一试:
1 | numbers = [10, 20, 30, 40] |
7.4 in 关键字
in 关键字可以用来检查某个元素是否存在于列表中。如果存在,它会返回 True(真),否则返回 False(假)。这在我们想快速查找某个东西是否在列表里时非常有用!
| Python 表达式 | 结果 | 描述 |
|---|---|---|
3 in [1, 2, 3] |
True |
3 是列表中的元素 |
5 in [1, 2, 3] |
False |
5 不是列表中的元素 |
动手试一试:
1 | fruits = ['苹果', '香蕉', '橙子'] |
7.5 for 循环
我们可以使用 for 循环来遍历列表中的每一个元素,逐个处理它们。这是非常常用的操作。
| Python 表达式 | 结果(打印出来) | 描述 |
|---|---|---|
for x in [1, 2, 3]: print(x, end=' ') |
1 2 3 |
依次取出列表中的元素并打印 |
动手试一试:
1 | print("列表中的元素是:") |
八、Python 列表截取(高级索引)
我们之前学过通过索引获取单个元素和通过 [start:end] 获取切片,即,一连串元素。这里我们再补充一些更灵活的截取方式,特别是关于负数索引的使用
负数索引是什么意思呢?它允许我们从列表的末尾开始计数。
L[-1]表示列表的最后一个元素。L[-2]表示列表的倒数第二个元素。- 以此类推。
列表截取实例:
假设我们有一个列表:
1 | L = ['Google', 'Runoob', 'Taobao'] # 索引 0: 'Google', 1: 'Runoob', 2: 'Taobao' |
| Python 表达式 | 结果 | 描述 |
|---|---|---|
L[2] |
'Taobao' |
读取列表中第三个元素(索引为2) |
L[-2] |
'Runoob' |
读取列表中倒数第二个元素(索引为-2) |
L[1:] |
['Runoob', 'Taobao'] |
从索引1开始截取到列表末尾(包含索引1的元素) |
L[:-1] |
['Google', 'Runoob'] |
从列表开头截取到倒数第一个元素之前(不包含最后一个元素) |
L[:] |
['Google', 'Runoob', 'Taobao'] |
截取整个列表(相当于创建了原列表的一个副本) |
动手试一试,加深理解:
1 | L = ['Google', 'Runoob', 'Taobao'] |
小贴士:L[start:end] 中,start 是起始索引(包含),end 是结束索引(不包含)。
如果 start 省略(如 L[:end]),则默认从索引 0 开始。
如果 end 省略(如 L[start:]),则默认截取到列表末尾。
九、Python 列表函数 & 方法
Python 为列表提供了一些内置的 函数 (Functions) 和 **方法 (Methods)**,帮助我们更方便地操作列表。
函数 通常是独立的,可以直接调用,作用于列表。
方法 则是列表对象自带的“功能”,需要通过列表对象来调用,例如 list.append()。
我们先来了解常用的 列表函数。点击每个函数名称可以展开查看详细说明和示例。
9.1 列表函数速览
以下是一些常用的 Python 内置列表函数:
-
Python List cmp() 方法 (注意:Python 3 已移除该函数)
描述
cmp()方法用于比较两个列表的元素。语法
cmp()方法语法:1
cmp(list1, list2)
参数
list1– 要比较的第一个列表。list2– 要比较的第二个列表。
返回值
- 如果比较的元素是同类型的,则比较其值,返回结果:
- 如果
list1小于list2,返回 -1。 - 如果
list1大于list2,返回 1。 - 如果
list1等于list2,返回 0。
- 如果
- 如果两个元素不是同一种类型,则检查它们是否是数字:
- 如果是数字,执行必要的数字强制类型转换,然后比较。
- 如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)。
- 否则,通过类型名字的字母顺序进行比较。
- 如果有一个列表首先到达末尾,则另一个长一点的列表“大”。
- 如果两个列表的所有元素都相等且长度相同,则返回 0。
实例
以下实例展示了cmp()函数的使用方法(注意:此代码在 Python 3 中会报错):1
2
3
4
5
6
7
8
9#!/usr/bin/python
# -*- coding: UTF-8 -*-
list1, list2 = [123, 'xyz'], [456, 'abc']
print(cmp(list1, list2)) # 输出: -1,因为 123 < 456
print(cmp(list2, list1)) # 输出: 1,因为 456 > 123
list3 = list2 + [786] # list3 现在是 [456, 'abc', 786]
print(cmp(list2, list3)) # 输出: -1,因为 list2 比 list3 短注意:
cmp()函数在 Python 3.x 版本中已经被移除。在 Python 3 中,比较两个列表可以直接使用关系运算符==,!=,<,<=,>,>=,它们会按照元素的顺序和值进行比较,规则与cmp()类似,但返回布尔值True或False。例如list1 < list2。 -
Python len() 函数
描述
len()函数用于返回列表中元素的个数,即列表的长度。语法
len()函数语法:1
len(list)
参数
list– 要计算长度的列表。
返回值
一个整数,表示列表中元素的数量。实例
以下实例展示了len()函数的使用方法:1
2
3
4
5fruits = ['苹果', '香蕉', '橙子', '葡萄']
print("水果列表的长度是:", len(fruits)) # 输出: 水果列表的长度是: 4
empty_list = []
print("空列表的长度是:", len(empty_list)) # 输出: 空列表的长度是: 0 -
Python max() 函数
描述
max()函数用于返回列表中元素的最大值。列表中的元素必须是可比较的类型(例如,都是数字,或者都是字符串)。语法
max()函数语法:1
max(list)
参数
list– 要从中找出最大值的列表。
返回值
列表中最大的元素。实例
以下实例展示了max()函数的使用方法:1
2
3
4
5numbers = [10, 25, 5, 42, 18]
print("列表中最大的数字是:", max(numbers)) # 输出: 列表中最大的数字是: 42
words = ['apple', 'banana', 'cherry', 'date']
print("列表中按字母顺序最大的单词是:", max(words)) # 输出: 列表中按字母顺序最大的单词是: date (因为 'd' 在字母表中最靠后)注意:
如果列表中包含不同类型且不可比较的元素(如同时包含数字和字符串),max()函数会抛出TypeError错误。 -
Python min() 函数
描述
min()函数用于返回列表中元素的最小值。列表中的元素必须是可比较的类型。语法
min()函数语法:1
min(list)
参数
list– 要从中找出最小值的列表。
返回值
列表中最小的元素。实例
以下实例展示了min()函数的使用方法:1
2
3
4
5numbers = [10, 25, 5, 42, 18]
print("列表中最小的数字是:", min(numbers)) # 输出: 列表中最小的数字是: 5
words = ['apple', 'banana', 'cherry', 'date']
print("列表中按字母顺序最小的单词是:", min(words)) # 输出: 列表中按字母顺序最小的单词是: apple (因为 'a' 在字母表中最靠前)注意:
与max()类似,如果列表中包含不同类型且不可比较的元素,min()函数会抛出TypeError错误。 -
Python list() 函数
描述
list()函数用于将一个可迭代对象(如元组、字符串、集合、字典等)转换为一个列表。如果不提供参数,它会创建一个空列表。语法
list()函数语法:1
list(seq)
参数
seq(可选) – 一个可迭代对象。如果省略,则返回空列表。
返回值
一个新的列表,包含了可迭代对象中的所有元素。实例
以下实例展示了list()函数的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13# 将元组转换为列表
my_tuple = (1, 2, 3, 'hello')
my_list = list(my_tuple)
print("从元组转换而来的列表:", my_list) # 输出: 从元组转换而来的列表: [1, 2, 3, 'hello']
# 将字符串转换为列表 (每个字符成为列表的一个元素)
my_string = "Python"
str_list = list(my_string)
print("从字符串转换而来的列表:", str_list) # 输出: 从字符串转换而来的列表: ['P', 'y', 't', 'h', 'o', 'n']
# 创建空列表
empty_list = list()
print("空列表:", empty_list) # 输出: 空列表: []
这样,用户可以通过点击函数名来展开查看详细信息,平时则保持折叠状态,使页面更加整洁。注意 cmp() 函数在 Python 3 中已移除,我在描述中特别指出了这一点。
9.2 列表方法详解
列表方法是列表对象自带的函数,用于对列表进行各种操作。调用方式是 列表名.方法名(参数)。
-
Python List append() 方法
描述
append()方法用于在列表的末尾添加新的对象。语法
append()方法语法:1
list.append(obj)
参数
obj– 要添加到列表末尾的对象(可以是任何数据类型)。
返回值
该方法没有返回值(返回None),但会直接修改原来的列表。实例
以下实例展示了append()方法的使用方法:1
2
3
4
5
6
7
8aList = [123, 'xyz', 'zara', 'abc']
print("添加前的列表:", aList) # 输出: 添加前的列表: [123, 'xyz', 'zara', 'abc']
aList.append(2009) # 在列表末尾添加整数 2009
print("Updated List : ", aList) # 输出: Updated List : [123, 'xyz', 'zara', 'abc', 2009]
aList.append(['a', 'b']) # 在列表末尾添加一个新列表 ['a', 'b']
print("再次添加后的列表:", aList) # 输出: 再次添加后的列表: [123, 'xyz', 'zara', 'abc', 2009, ['a', 'b']] -
Python List count() 方法
描述
count()方法用于统计某个元素在列表中出现的次数。语法
count()方法语法:1
list.count(obj)
参数
obj– 要统计出现次数的对象。
返回值
一个整数,表示指定元素在列表中出现的次数。如果元素不存在,则返回0。实例
以下实例展示了count()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13fruits = ['apple', 'banana', 'orange', 'apple', 'grape', 'apple']
# 统计 'apple' 出现的次数
apple_count = fruits.count('apple')
print("'apple' 在列表中出现了", apple_count, "次") # 输出: 'apple' 在列表中出现了 3 次
# 统计 'watermelon' 出现的次数(不存在)
watermelon_count = fruits.count('watermelon')
print("'watermelon' 在列表中出现了", watermelon_count, "次") # 输出: 'watermelon' 在列表中出现了 0 次
# 对于嵌套列表,count 不会递归查找
nested_list = [1, 2, [1, 1], 1, [2]]
print("1 在 nested_list 中出现了", nested_list.count(1), "次") # 输出: 1 在 nested_list 中出现了 3 次 (只统计了顶层的 1) -
Python List extend() 方法
描述
extend()方法用于在列表的末尾一次性追加另一个序列中的多个值(可以是列表、元组、字符串等可迭代对象)。它会将可迭代对象中的每个元素单独添加到原列表中。语法
extend()方法语法:1
list.extend(seq)
参数
seq– 一个可迭代对象(如列表、元组、字符串、集合等),其元素将被添加到原列表的末尾。
返回值
该方法没有返回值(返回None),但会直接修改原来的列表。实例
以下实例展示了extend()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 用 list2 扩展 list1
list1.extend(list2)
print("用 list2 扩展后的 list1:", list1) # 输出: 用 list2 扩展后的 list1: [1, 2, 3, 4, 5, 6]
# 用元组扩展列表
tuple1 = ('a', 'b', 'c')
list1.extend(tuple1)
print("用元组扩展后的 list1:", list1) # 输出: 用元组扩展后的 list1: [1, 2, 3, 4, 5, 6, 'a', 'b', 'c']
# 用字符串扩展列表 (字符串的每个字符会被当作一个元素)
str1 = "hello"
list1.extend(str1)
print("用字符串扩展后的 list1:", list1) # 输出: 用字符串扩展后的 list1: [1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'h', 'e', 'l', 'l', 'o']append()与extend()的区别:append(obj):将obj作为一个整体添加到列表末尾。如果obj是一个列表,它会成为原列表的一个新元素(嵌套列表)。extend(seq):将seq中的每个元素都添加到列表末尾。它会“拆开”可迭代对象seq。
例如:
1
2
3
4
5
6
7
8
9a = [1, 2, 3]
b = [4, 5]
a.append(b)
print(a) # 输出: [1, 2, 3, [4, 5]]
a = [1, 2, 3] # 重置 a
a.extend(b)
print(a) # 输出: [1, 2, 3, 4, 5] -
Python List insert() 方法
描述
insert()方法用于将指定对象插入列表的指定位置。语法
insert()方法语法:1
list.insert(index, obj)
参数
index– 对象obj需要插入的索引位置。新元素将被放置在该索引处,原索引处及之后的元素将依次向后移动一位。obj– 要插入列表中的对象。
返回值
该方法没有返回值(返回None),但会直接修改原来的列表。实例
以下实例展示了insert()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14aList = [123, 'xyz', 'zara', 'abc']
print("插入前的列表:", aList) # 输出: 插入前的列表: [123, 'xyz', 'zara', 'abc']
# 在索引 3 的位置插入 2009
aList.insert(3, 2009)
print("Final List : ", aList) # 输出: Final List : [123, 'xyz', 'zara', 2009, 'abc']
# 在列表开头插入 (索引 0)
aList.insert(0, 'start')
print("在开头插入后的列表:", aList) # 输出: 在开头插入后的列表: ['start', 123, 'xyz', 'zara', 2009, 'abc']
# 在列表末尾插入 (索引可以是 len(list))
aList.insert(len(aList), 'end')
print("在末尾插入后的列表:", aList) # 输出: 在末尾插入后的列表: ['start', 123, 'xyz', 'zara', 2009, 'abc', 'end']1 篇笔记:
insert 注意事项
- 如果
index大于列表的长度,则会将元素添加到列表的末尾,相当于append(obj)。 - 如果
index是负数,则表示从列表末尾开始计数(与负数索引类似)。例如index=-1表示插入到倒数第一个元素之前。 - 列表为空时,位置参数无效? 严格来说,当列表为空时,任何
index都会导致元素被插入(因为列表为空,插入后只有一个元素)。例如empty_list.insert(100, 'a')会使empty_list变为['a']。
例题:实现对列表的重新排序。
原代码(可能存在问题):
1
2
3
4
5
6list1 = ['A','B','C']
list2 = []
for i in range (3):
order = int(input('你要把'+list1[i]+'放在第几位?(请输入数字1,2,3):'))
list2.insert(order - 1, list1[i])
print(list2 )运行结果如下:
1
2
3
4你要把A放在第几位?(请输入数字1,2,3):3
你要把B放在第几位?(请输入数字1,2,3):2
你要把C放在第几位?(请输入数字1,2,3):1
['C', 'A', 'B']问题分析:
这段代码的逻辑是,依次询问 A、B、C 要放在新列表 list2 的第几位(用户输入 1,2,3,代码转为索引 order-1)。- 放 A 时,list2 为空,
insert(2, 'A')→ list2 变为['A'](因为列表长度为0,插入索引2会自动放到末尾,即索引0,但这里可能用户期望的是最终位置,而不是动态插入)。 - 放 B 时,用户输入 2 → 索引1。此时 list2 是
['A'],在索引1插入 ‘B’ → list2 变为['A', 'B']。 - 放 C 时,用户输入 1 → 索引0。在索引0插入 ‘C’ → list2 变为
['C', 'A', 'B']。
这与用户期望的 “A放3,B放2,C放1” 得到['C', 'B', 'A']的结果不符。因为每次插入都会影响后续元素的位置。
例题正确答案(思路):
使用字典来记录每个元素的目标位置,然后按位置顺序构建新列表。1
2
3
4
5
6
7
8
9
10
11list1 = ['A','B','C']
dict1 = {} # 用字典存储 {目标位置: 元素}
for i in range(3):
order = int(input('你要把'+list1[i]+'放在第几位?(请输入数字1,2,3)'))
dict1[order] = list1[i]
print(dict1) # 例如输入 3,2,1,dict1 会是 {3: 'A', 2: 'B', 1: 'C'}
list1 = [] # 清空原本列表list1的元素
for i in range(1,4): # 按位置1,2,3的顺序从字典中取值
list1.append(dict1[i])
print(list1) # 输出: ['C', 'B', 'A']运行结果如下:
1
2
3
4
5你要把A放在第几位?(请输入数字1,2,3)3
你要把B放在第几位?(请输入数字1,2,3)2
你要把C放在第几位?(请输入数字1,2,3)1
{3: 'A', 2: 'B', 1: 'C'}
['C', 'B', 'A']这种方法的优点: 先收集所有元素的最终目标位置,然后一次性按顺序排列,避免了动态插入时元素位置互相影响的问题。
-
Python List index() 方法
描述
index()方法用于从列表中找出某个值 第一个匹配项的索引位置。语法
index()方法语法:1
list.index(obj)
参数
obj– 要查找其索引的对象。
返回值
该方法返回查找对象的第一个出现的索引位置。如果在列表中没有找到指定对象,则会抛出ValueError异常。实例
以下实例展示了index()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16fruits = ['apple', 'banana', 'orange', 'apple', 'grape']
# 查找 'banana' 的索引
banana_index = fruits.index('banana')
print("'banana' 的索引是:", banana_index) # 输出: 'banana' 的索引是: 1
# 查找 'apple' 的索引 (返回第一个出现的 'apple' 的索引)
apple_index = fruits.index('apple')
print("第一个 'apple' 的索引是:", apple_index) # 输出: 第一个 'apple' 的索引是: 0
# 尝试查找不存在的元素
try:
watermelon_index = fruits.index('watermelon')
print("'watermelon' 的索引是:", watermelon_index)
except ValueError:
print("'watermelon' 不在列表中。") # 输出: 'watermelon' 不在列表中。1 篇笔记:
index() 注意事项
- 只返回第一个匹配项:如果列表中有多个相同的元素,
index()只返回第一个出现的元素的索引。 - 元素不存在则报错:如果要查找的元素不在列表中,
index()会抛出ValueError。因此,在不确定元素是否存在时,建议先用in关键字检查,例如:1
2
3
4if 'watermelon' in fruits:
print(fruits.index('watermelon'))
else:
print("'watermelon' 不在列表中。") - 指定起始和结束位置(扩展用法):
index()方法还可以接受两个可选参数start和end,用于指定查找的范围:list.index(obj, start, end)
表示从索引start开始查找,到索引end结束(不包含end)。
例如:1
2
3
4numbers = [1, 2, 3, 2, 1]
print(numbers.index(2)) # 输出: 1 (第一个 2)
print(numbers.index(2, 2)) # 输出: 3 (从索引2开始查找第一个 2)
# print(numbers.index(2, 4)) # 会抛出 ValueError,因为从索引4开始到末尾没有 2
-
Python List pop() 方法
描述
pop()方法用于移除列表中的一个元素(默认是最后一个元素),并返回该元素的值。语法
pop()方法语法:1
list.pop([index=-1])
方括号
[]中的参数表示可选参数。index=-1表示如果不提供索引,默认移除并返回最后一个元素。参数
index(可选) – 要移除元素的索引位置。如果不指定,默认为-1,即最后一个元素。
返回值
返回被移除的元素。如果列表为空,或者指定的索引超出范围,则会抛出IndexError异常。实例
以下实例展示了pop()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16fruits = ['apple', 'banana', 'orange', 'grape']
# 默认移除并返回最后一个元素
last_fruit = fruits.pop()
print("被移除的元素 (默认最后一个):", last_fruit) # 输出: 被移除的元素 (默认最后一个): grape
print("pop 后的列表:", fruits) # 输出: pop 后的列表: ['apple', 'banana', 'orange']
# 移除并返回指定索引 (索引1) 的元素
banana = fruits.pop(1)
print("被移除的元素 (索引1):", banana) # 输出: 被移除的元素 (索引1): banana
print("pop(1) 后的列表:", fruits) # 输出: pop(1) 后的列表: ['apple', 'orange']
# 移除并返回第一个元素 (索引0)
first_fruit = fruits.pop(0)
print("被移除的元素 (索引0):", first_fruit) # 输出: 被移除的元素 (索引0): apple
print("pop(0) 后的列表:", fruits) # 输出: pop(0) 后的列表: ['orange']1 篇笔记:
pop() 注意事项与应用
- 修改原列表:
pop()方法会直接修改原列表,并返回被移除的元素。这一点与del语句不同,del语句没有返回值。 - 空列表或无效索引:如果对一个空列表使用
pop(),或者指定的索引超出了列表的有效范围(0 <= index < len(list)),会抛出IndexError: pop from empty list或IndexError: pop index out of range。 - 实现栈和队列:
pop()方法常与append()方法一起使用来实现 栈 (Stack) 和 队列 (Queue) 数据结构:- **栈 (LIFO - 后进先出)**:使用
append(obj)在末尾添加元素,使用pop()从末尾移除元素。 - **队列 (FIFO - 先进先出)**:使用
append(obj)在末尾添加元素,使用pop(0)从开头移除元素。不过,对于频繁的pop(0)操作,列表效率不高,推荐使用collections.deque。
- **栈 (LIFO - 后进先出)**:使用
- 获取并删除元素:当你需要获取列表中某个元素,并且同时将其从列表中删除时,
pop()非常有用。1
2
3
4
5
6
7stack = []
stack.append("A")
stack.append("B")
stack.append("C")
print("栈:", stack) # 输出: 栈: ['A', 'B', 'C']
print("弹出:", stack.pop()) # 输出: 弹出: C
print("栈:", stack) # 输出: 栈: ['A', 'B']
-
Python List remove() 方法
描述
remove()方法用于移除列表中某个值的 第一个匹配项。语法
remove()方法语法:1
list.remove(obj)
参数
obj– 要从列表中移除的对象。
返回值
该方法没有返回值(返回None),但会直接修改原来的列表,移除第一个匹配到的元素。如果在列表中没有找到指定的对象,则会抛出ValueError异常。实例
以下实例展示了remove()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17fruits = ['apple', 'banana', 'orange', 'apple', 'grape']
print("移除前的列表:", fruits) # 输出: 移除前的列表: ['apple', 'banana', 'orange', 'apple', 'grape']
# 移除第一个 'apple'
fruits.remove('apple')
print("移除 'apple' 后的列表:", fruits) # 输出: 移除 'apple' 后的列表: ['banana', 'orange', 'apple', 'grape']
# 移除 'orange'
fruits.remove('orange')
print("移除 'orange' 后的列表:", fruits) # 输出: 移除 'orange' 后的列表: ['banana', 'apple', 'grape']
# 尝试移除不存在的元素
try:
fruits.remove('watermelon')
print("移除 'watermelon' 后的列表:", fruits)
except ValueError:
print("'watermelon' 不在列表中,无法移除。") # 输出: 'watermelon' 不在列表中,无法移除。1 篇笔记:
remove() 注意事项及与 pop()、del 的区别
- 只移除第一个匹配项:与
index()类似,如果列表中有多个相同的元素,remove()只移除第一个出现的那个。如果要移除所有匹配项,需要结合循环使用。 - 按值查找,而非索引:
remove(obj)是根据元素的值来查找并删除的,而pop(index)是根据索引来删除的。del list[index]也是根据索引删除。 - 元素不存在则报错:与
index()一样,如果obj不在列表中,remove()会抛出ValueError。因此,删除前最好用in检查。 - 没有返回值:
remove()没有返回值,它只是修改列表。而pop()会返回被删除的元素。
对比示例:
1
2
3
4
5
6
7
8
9
10
11
12
13numbers = [1, 2, 3, 2, 1]
# 使用 remove()
numbers.remove(2)
print(numbers) # 输出: [1, 3, 2, 1] (移除了第一个 2)
# 使用 pop()
popped = numbers.pop(1) # 移除索引1的元素 (3)
print(numbers, "被弹出的元素:", popped) # 输出: [1, 2, 1] 被弹出的元素: 3
# 使用 del
del numbers[0] # 移除索引0的元素 (1)
print(numbers) # 输出: [2, 1]如何移除列表中所有某个元素?
可以用 while 循环:1
2
3
4numbers = [1, 2, 2, 3, 2, 4]
while 2 in numbers:
numbers.remove(2)
print(numbers) # 输出: [1, 3, 4]
-
Python List reverse() 方法
描述
reverse()方法用于将列表中的元素原地反转,即第一个元素变成最后一个,最后一个元素变成第一个,以此类推。语法
reverse()方法语法:1
list.reverse()
参数
该方法没有参数。返回值
该方法没有返回值(返回None),但会直接修改原来的列表。实例
以下实例展示了reverse()方法的使用方法:1
2
3
4
5
6
7
8
9numbers = [1, 2, 3, 4, 5]
print("反转前的列表:", numbers) # 输出: 反转前的列表: [1, 2, 3, 4, 5]
numbers.reverse()
print("反转后的列表:", numbers) # 输出: 反转后的列表: [5, 4, 3, 2, 1]
fruits = ['apple', 'banana', 'cherry']
fruits.reverse()
print("水果列表反转后:", fruits) # 输出: 水果列表反转后: ['cherry', 'banana', 'apple']1 篇笔记:
reverse() 注意事项及与 reversed() 函数的区别
- 原地修改:
reverse()方法会直接修改调用它的列表本身,而不是创建一个新的反转列表。 - 无返回值:记住
reverse()返回None,不要尝试将其结果赋值给另一个变量,例如new_list = numbers.reverse()会得到new_list = None。 reversed()内置函数:如果不想修改原列表,而是希望得到一个反转的迭代器(可用于创建新列表),可以使用内置函数reversed()。例如:1
2
3
4numbers = [1, 2, 3, 4, 5]
reversed_numbers = list(reversed(numbers)) # 将 reversed 对象转换为列表
print("原列表:", numbers) # 输出: 原列表: [1, 2, 3, 4, 5] (未被修改)
print("反转后的新列表:", reversed_numbers) # 输出: 反转后的新列表: [5, 4, 3, 2, 1]- 反转字符串:字符串也可以用
[::-1]的切片方式反转,列表也可以:numbers[::-1]会返回一个新的反转列表,原列表不变。1
2
3
4numbers = [1,2,3]
reversed_numbers = numbers[::-1]
print(numbers) # [1,2,3]
print(reversed_numbers) # [3,2,1]
- 原地修改:
list.sort(cmp=None, key=None, reverse=False)Python List sort() 方法
描述
sort()方法用于对原列表进行原地排序(默认是升序排序)。可以通过参数指定排序规则。语法
sort()方法语法:1
list.sort(cmp=None, key=None, reverse=False)
参数
cmp(可选,Python 3 已移除) – 比较函数,该函数应有两个参数,且返回一个负数、零或正数来表示第一个参数比第二个参数小、相等或大。在 Python 3 中,此参数已被移除,推荐使用key参数。key(可选) – 用于从每个列表元素中提取一个用于比较的键(例如,key=str.lower表示在排序字符串时忽略大小写)。这个函数只接受一个参数,并返回一个用于排序的键。reverse(可选) – 排序规则,reverse=False(默认) 表示升序,reverse=True表示降序。
返回值
该方法没有返回值(返回None),但会直接修改原来的列表。实例
以下实例展示了sort()方法的使用方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# 基本升序排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print("排序前:", numbers) # 输出: 排序前: [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print("升序排序后:", numbers) # 输出: 升序排序后: [1, 1, 2, 3, 4, 5, 6, 9]
# 降序排序
numbers.sort(reverse=True)
print("降序排序后:", numbers) # 输出: 降序排序后: [9, 6, 5, 4, 3, 2, 1, 1]
# 对字符串列表排序 (默认按字母顺序)
fruits = ['banana', 'apple', 'cherry', 'date']
fruits.sort()
print("字符串升序排序:", fruits) # 输出: 字符串升序排序: ['apple', 'banana', 'cherry', 'date']
# 使用 key 参数 (按字符串长度排序)
fruits.sort(key=len) # len 是内置函数,返回字符串长度
print("按长度升序排序:", fruits) # 输出: 按长度升序排序: ['date', 'apple', 'banana', 'cherry'] (date 长度4,apple 5, banana 6, cherry 6)
# 使用 key 参数和 lambda 函数 (按元素的第二个字符排序)
words = ['banana', 'apple', 'cherry', 'date']
words.sort(key=lambda x: x[1]) # x 代表列表中的每个元素,x[1] 是元素的第二个字符
print("按第二个字符排序:", words) # 输出: 按第二个字符排序: ['banana', 'apple', 'date', 'cherry']
# 解释: 'banana'[1] = 'a', 'apple'[1] = 'p', 'date'[1] = 'a', 'cherry'[1] = 'h'
# 按 'a' (97), 'a' (97), 'h' (104), 'p' (112) 的 ASCII 码排序1 篇笔记:
sort() 注意事项及与 sorted() 函数的区别
- 原地排序,无返回值:
sort()会直接修改原列表,并且没有返回值(返回None)。不要写成new_list = my_list.sort(),这会使new_list为None。 sorted()内置函数:如果不想修改原列表,而是希望得到一个新的已排序列表,请使用内置函数sorted()。sorted()接受与sort()类似的key和reverse参数,但它会返回一个新列表,原列表保持不变。1
2
3
4numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers) # sorted() 返回新列表
print("原列表:", numbers) # 输出: 原列表: [3, 1, 4, 1, 5]
print("新的排序后列表:", sorted_numbers) # 输出: 新的排序后列表: [1, 1, 3, 4, 5]key参数比cmp更高效:在 Python 3 中移除了cmp参数,因为key参数通常执行得更快,也更易于使用。key函数为每个元素生成一个用于比较的键,排序基于这些键。- 稳定性:从 Python 3.0 开始,
sort()和sorted()都是稳定排序(Stable Sort)。这意味着当多个元素具有相同的排序键时,它们的相对顺序会保留原始列表中的顺序。 - 自定义对象排序:对于自定义对象组成的列表,可以通过
key参数指定排序的属性。例如,有一个Person类的实例列表,可以用key=lambda p: p.age按年龄排序。 - 不可变类型:字符串、元组等不可变类型没有
sort()方法,必须使用sorted()函数。例如sorted("cab")返回['a', 'b', 'c']。
常见错误示例:
1
2
3
4
5
6
7
8
9
10
11my_list = [3, 1, 2]
# 错误用法:试图将 sort() 的结果赋值
new_list = my_list.sort()
print(new_list) # 输出: None (而不是 [1,2,3])
print(my_list) # 输出: [1, 2, 3] (原列表已被修改)
# 正确用法(如果要新列表):
my_list = [3, 1, 2]
new_list = sorted(my_list)
print(new_list) # 输出: [1, 2, 3]
print(my_list) # 输出: [3, 1, 2] (原列表未修改)
练习
基础练习
练习 1:创建与访问
创建一个包含你最喜欢的 5 种水果名称的列表。然后:
- 打印列表的长度。
- 打印列表中的第三个水果(索引为 2)。
- 打印列表中的最后一个水果(使用负数索引)。
- 打印列表中从第二个水果到第四个水果的切片(包含第二个和第四个)。
参考答案
1 | # 创建水果列表 |
练习 2:列表修改与操作符
现有列表 numbers = [10, 20, 30, 40, 50]。请进行以下操作:
- 在列表末尾添加元素 60。
- 在索引 1 的位置插入元素 15。
- 使用
+操作符将列表[70, 80]与numbers合并,并将结果赋给一个新列表new_numbers(不要修改原numbers列表)。 - 打印修改后的
numbers列表和new_numbers列表。
参考答案
1 | numbers = [10, 20, 30, 40, 50] |
练习 3:列表方法应用
现有列表 words = ['apple', 'Banana', 'cherry', 'apple', 'date', 'banana']。请完成:
- 统计 ‘apple’ 在列表中出现的次数。
- 将列表中的所有元素转换为小写(提示:创建一个新列表,使用循环和
lower()方法)。 - 在新的小写列表中,移除第一个出现的 ‘banana’。
- 对新列表进行升序排序。
- 反转排序后的列表。
参考答案
1 | words = ['apple', 'Banana', 'cherry', 'apple', 'date', 'banana'] |
综合练习
练习 4:列表去重
编写一个函数 remove_duplicates(lst),接收一个列表作为参数,返回一个新的列表,其中不包含原列表中的重复元素,且元素的顺序与原列表中第一次出现的顺序一致。
例如:remove_duplicates([1, 2, 2, 3, 1, 4]) 应返回 [1, 2, 3, 4]。
参考答案
1 | def remove_duplicates(lst): |
思路解析:
- 创建一个空列表
seen来存储已经遇到的元素。 - 遍历原列表中的每个元素。
- 如果元素不在
seen中,就将其添加到seen。 - 最后返回
seen,它包含了所有首次出现的元素,没有重复。
练习 5:列表元素统计
给定一个数字列表 numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 5, 5],统计列表中每个数字出现的次数,并将结果以字典形式返回,其中键是数字,值是对应的次数。
参考答案
1 | numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 5, 5] |
思路解析:
- 创建一个空字典
count_dict用于存储统计结果。 - 遍历列表中的每个数字。
- 检查数字是否已经是字典的键:
- 如果是,对应的值(次数)加 1。
- 如果不是,将该数字作为新键加入字典,值设为 1。
- 遍历结束后,字典就包含了每个数字及其出现的次数。
练习 6:学生成绩处理
假设有一个学生成绩列表,每个元素是一个包含学生姓名和成绩的列表,例如:students = [['Alice', 85], ['Bob', 78], ['Charlie', 92], ['David', 88], ['Eve', 76]]。
请完成以下操作:
- 计算所有学生的平均成绩。
- 找出成绩最高的学生姓名和成绩。
- 将学生列表按成绩从高到低排序。
参考答案
1 | students = [['Alice', 85], ['Bob', 78], ['Charlie', 92], ['David', 88], ['Eve', 76]] |
输出结果:
1 | 平均成绩: 83.80 |
思路解析:
- 平均成绩:遍历学生列表,累加所有成绩,然后除以学生人数。
- 最高成绩:初始化
max_score为一个较小值,遍历过程中不断更新更高的分数和对应的学生姓名。 - 排序:使用
list.sort()方法,通过key=lambda x: x[1]指定按子列表的第二个元素(成绩)排序,reverse=True确保是降序。
练习 7:列表的嵌套与扁平化
给定一个嵌套列表 nested_list = [1, [2, [3, 4], 5], 6, [7, 8]],编写一个函数将其扁平化为一个一维列表 [1, 2, 3, 4, 5, 6, 7, 8]。(提示:可以使用递归)
参考答案
1 | def flatten(nested): |
思路解析:
- 定义一个
flatten函数,接收一个嵌套列表。 - 创建一个空列表
flat_list用于存放结果。 - 遍历输入列表的每个元素
item。 - 如果
item本身也是一个列表(用isinstance(item, list)判断),则递归调用flatten(item),并将返回的扁平化子列表用extend()添加到flat_list。 - 如果
item不是列表,则直接用append()添加到flat_list。 - 递归是处理嵌套结构的常用方法,它会逐层深入直到所有元素都是非列表类型。
希望这些练习能帮助你巩固 Python 列表的知识!尝试独立完成它们,如果遇到困难,再查看参考答案。编程能力的提升离不开大量的实践。加油!








