一 列表和元组
1,序列概述
(1)列表
列表是一种可修改的序列,可以存储多个数据。
特点:使用 [] 表示;元素之间用逗号分隔;可以增加、删除、修改元素。
示例:
python
edward = ['Edward Gumby', 42]
列表可以嵌套(列表中的元素也可以是列表)
python
edward = ['Edward Gumby', 42]
john = ['John Smith', 50]
database = [edward, john]
结果:
python
[
['Edward Gumby', 42],
['John Smith', 50]
]
(2)元组
元组也是一种序列。
特点:使用 () 表示;不可修改;适合保存固定数据。
因为某些数据结构要求内容不能改变,所以才会有元组的提出
示例:
python
person = ('Edward Gumby', 42)
两者比较:

(3)容器
Python 中:
可以包含其他对象的数据结构称为容器。
常见容器:
(1)序列:
元素按照顺序排列:
例如:list tuple(元组) str
特点:每个元素有编号(索引)。
python
a = ['A','B','C']
(2)映射
例如:dict(字典)
特点:通过键访问数据
python
student = {
"name":"Tom",
"age":20
}
访问
python
student["name"]
(3)集合(set)
集合:不属于序列;不属于映射;元素无序;元素不能重复。
python
s = {1,2,3}
2,通用的序列操作
2,1 序列索引
(1)正向索引
序列索引从 0 开始
示例:
python
greeting = "Hello"
对应索引:
python
索引: 0 1 2 3 4
字符: H e l l o
访问:
python
greeting[0]
结果:
python
'H'
(2)负索引
Python 支持从右向左访问元素
负索引规则:
python
字符: H e l l o
正索引 0 1 2 3 4
负索引 -5 -4 -3 -2 -1
(3)字符串也是序列
Python 没有单独的字符类型
示例:
python
'Hello'[1]
结果:
python
'e'
说明字符串本质上是由多个字符组成的序列
(4)直接对序列使用索引
示例:
python
"Python"[0]
'P'
等价于:
python
s = "Python"
s[0]
(5)函数返回值也可以索引
如果函数返回一个序列,可以直接索引
示例:
python
fourth = input("Year: ")[3]
输入:
python
Year: 2005
执行:
python
fourth
结果:
python
'5'
(6)实例:根据日期输出月份
输入:
python
年份
月份
日期
然后根据月份索引列表获取月份名称
python
months = [
'January',
'February',
'March',
...
]
注意索引偏移问题
用户输入:
python
Month: 8
列表索引:
python
January → 0
February → 1
March → 2
...
August → 7
所以:
python
months[month_number-1]
需要减1.
使用索引生成日期后缀
示例:
python
endings = ['st','nd','rd'] + 17 * ['th'] \
+ ['st','nd','rd'] + 7 * ['th'] \
+ ['st']
通过
python
endings[day_number-1]
来获取日期后缀。
总结:
python
months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
]
# 一个列表,其中包含数1~31对应的结尾
endings = ['st', 'nd', 'rd'] + 17 * ['th'] \
+ ['st', 'nd', 'rd'] + 7 * ['th'] \
+ ['st']
year = input('Year: ')
month = input('Month (1-12): ')
day = input('Day (1-31): ')
month_number = int(month)
day_number = int(day)
# 别忘了将表示月和日的数减1,这样才能得到正确的索引
month_name = months[month_number-1]
ordinal = day + endings[day_number-1]
print(month_name + ' ' + ordinal + ', ' + year)
2,2 序列切片
切片格式:
python
序列[start:end:step]

(1)基本切片
示例:
python
numbers = [1,2,3,4,5,6,7,8,9,10]
获取索引3到6的元素
python
numbers[3:6]
结果:
python
[4,5,6]
(2)省略开始或结束索引
从开头开始
python
numbers[:3] 等价于 numbers[0:3]
结果:[1,2,3]
到末尾结束
python
numbers[7:] 等价于 numbers[7:10]
结果: [8,9,10]
复制整个序列
python
numbers[:]
结果: [1,2,3,4,5,6,7,8,9,10]
(3)负索引切片
示例:
python
numbers[-3:] 表示获取最后3个元素
结果: [8,9,10]
注意:
python
numbers[-3:-1] 不包含-1,只包含-3
结果:[8,9]
(4)切片步长
示例:
python
numbers[0:10:2] 表示从0开始,每隔2个元素取一次。
结果:[1,3,5,7,9]
(5)使用负步长反向切片
示例:
python
numbers[::-1] 表示反转序列
结果:[10,9,8,7,6,5,4,3,2,1]
(6)切片边界规则
切片特点:第一个索引包含,第二个索引不包含
示例;
python
numbers[3:6]
取 索引 3 4 5
不取 索引 6
(7)步长方向规则
正步长:从左向右
python
numbers[1:8:2]
结果:[2,4,6,8]
负步长:从右向左
python
numbers[8:1:-2]
结果:[9,7,5,3]
2,3 序列相加
Python 中可以使用 + 运算符连接相同类型的序列,支持元组,列表和字符串
(1)列表连接
使用+可以合并两个列表
python
>>> [1,2,3] + [4,5,6]
[1,2,3,4,5,6]
结果:两个列表元素按顺序拼接
(2)字符串连接
字符串也属于序列,可以使用+。
python
>>> "Hello, " + "world!"
'Hello, world!'
(3)不同类型序列不能相加
虽然列表和字符串都是序列,但是类型不同,不能连接
python
>>> [1,2,3] + "world" 是错误
报错:
TypeError:can only concatenate list (not "str") to list
(4)需要转换类型时
如果想连接不同类型,需要先转换。
python
[1,2,3] + list("abc")
结果:[1,2,3,'a','b','c']
str(123) + "abc"
结果:'123abc'
2,4 序列乘法
Python 中可以使用 * 运算符重复序列,生成新的序列。
python
序列 * n
表示将序列重复n次
(1)字符串乘法
示例:
python
>>> "python" * 5
结果:'pythonpythonpythonpythonpython'
(2)列表乘法
python
>>> [42] * 10
[42,42,42,42,42,42,42,42,42,42]
(3)使用乘法初始化列表
python
sequence = [None] * 10
结果:[None,None,None,None,None,
None,None,None,None,None]
其中:None表示空值,没有具体内容。
(4)注意:不要使用【】*n
错误使用:
python
sequence = [] * 10
结果:【】
原因:空列表重复多少次仍然为空
(5) 序列乘法规则
序列乘法要求:左边必须是序列;右边必须是整数
示例:
python
正确:"abc" * 3
结果:abcabcabc
错误:"abc" * "3"
(6)实例:利用字符串乘法绘制图形
python
sentence = input("Sentence: ")
screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) // 2
其中:
python
" " * left_margin
表示生成指定数量的空格,实现居中。
绘制边框:
顶部:
python
'+' + '-' * (box_width-2) + '+'
中间:
python
'|' + ' ' * text_width + '|'
2,5 Python序列成员资格
Python 可以使用 in 运算符判断某个元素是否存在于序列中。
python
元素 in 序列
返回结果:
(1)存在->True
(2)不存在->False
(1)字符串成员判断
python
permissions = 'rw'
'w' in permissions
结果:True
(2)列表成员判断
python
users = ['mlh','foo','bar']
'mlh' in users
结果:True
(3)子序列判断
对于字符串:in 判断的是子字符串是否存在
python
'$$$' in '$$$ Get rich now!!! $$$'
结果:True
注意:列表判断的是完整元素
python
[1,2] in [[1,2],[3,4]]
结果:True
2 in [[1,2],[3,4]]
结果:False
(4)实例:用户名和密码验证
python
#数据库
database = [
['albert','1234'],
['dilbert','4242'],
['smith','7524'],
['jones','9843']
]
#用户输入
username = input("User name: ")
pin = input("PIN code: ")
#判断
if [username, pin] in database:
print("Access granted")
原理:
python
#输入
albert
1234
#形成
['albert','1234']
#然后检查是否存在于database中
(5)长度,最大值,最小值
常用函数:
len():获取序列长度
python
numbers = [100,34,678]
len(numbers)
结果:3
max():获取最大值
python
max(numbers)
结果:678
min():获取最小值
python
min(numbers)
结果:34
max()和min()参数除了序列还可以是多个参数
python
序列:max([2,3])
多个参数:max(2,3)
3,列表
3.1 列表(list)以及基本的列表操作
列表(list)是 Python 中最重要的数据结构之一。
特点:有序;可修改(mutable); 支持索引、切片、拼接、重复等序列操作
创建列表:
python
id="1"
names = ['Alice', 'Bob', 'Cecil']
(1)使用list()创建列表
list() 可以将其他序列转换为列表
python
格式:list(sequence)
list("hello")
结果:['h','e','l','l','o']
(2)修改列表元素
列表可以通过索引直接修改元素。
python
list[index] = value
x = [1,1,1]
x[1] = 2
print(x)
结果:[1,2,1]
注意:索引必须存在,否则会报错。
(3)删除列表元素
使用del删除指定元素
python
格式:del list[index]
示例:names = ['Alice','Beth','Cecil','Dee-Dee','Earl']
del names[2]
结果:['Alice','Beth','Dee-Dee','Earl'] Cecil被删除
(4)切片赋值
列表切片不仅可以读取还可以修改
python
格式:list[start:end] = new_sequence
替换元素
python
name = list("Perl")
name[2:] = list("ar")
原列表:P e r l 被替换为 r l → a r
插入元素
切片赋值可以插入不同长度的数据
python
numbers = [1,5]
numbers[1:1] = [2,3,4]
结果:[1,2,3,4,5]
原因:numbers1:1 表示一个空切片,相当于插入位置
删除切片
将切片赋值为空列表
python
list[start:end] = []
示例:
python
numbers = [1,2,3,4,5]
numbers[1:4] = []
结果:[1,5]
等价于del numbers[1:4]
(5)切片赋值特点
普通赋值只能替换一个元素
python
x[1] = 10
切片赋值可以:替换多个元素;插入多个元素;删除多个元素。
python
x[1:3] = [10,20,30]
3.2 列表方法
列表(list)是 Python 中最常用的数据结构之一。列表是可变序列,可以通过方法直接修改内容。
格式:
python
list.method(arguments)
(1)append():添加元素
在列表末尾添加一个元素
python
格式:list.append(value)
示例:
lst = [1,2,3]
lst.append(4)
print(lst)
结果:[1,2,3,4]
特点:直接修改原列表;不返回新列表。
(2)clear():清空列表
删除列表中的所有元素
python
示例:lst = [1,2,3]
lst.clear()
print(lst)
结果:[] 等价于 lst[:] = []
(3)copy():复制列表
创建列表副本
python
示例:
a = [1,2,3]
b = a.copy()
b[1] = 4
结果:
a = [1,2,3]
b = [1,4,3]
区别:直接赋值是两个变量指向同一个列表;复制是创建新的列表
(4)count():统计元素出现次数
格式:
python
list.count(value)
示例:
python
x = ['a','b','a','c']
x.count('a')
结果:2
(5)extend():扩展列表
将另一个序列中的元素逐个加入列表
python
示例:
a = [1,2,3]
b = [4,5,6]
a.extend(b)
结果:[1,2,3,4,5,6]
extend() 与 + 的区别
使用 +:创建新列表;原列表不变。
使用extend():直接修改原列表;效率更高。
(6)index():查找元素位置
返回元素第一次出现的索引
格式:
python
list.index(value)
示例:
python
names = ['we','are','the','knights']
names.index('the')
结果:2
如果元素不存在,那么就会报错
python
names.index('abc')
报错:ValueError
(7)insert():插入元素
格式:
python
list.insert(index,value)
示例:
python
numbers = [1,2,3,5,6]
numbers.insert(3,4)
结果:[1,2,3,4,5,6]
也可以使用切片,效果是相同的
python
numbers[3:3] = [4]
(8)pop():删除并返回元素
删除列表元素,并返回删除的值
默认删除最后一个
python
x = [1,2,3]
x.pop()
返回:3
列表变为:[1,2]
指定位置删除
python
x.pop(0)
pop() 应用:栈结构
栈:后进先出
示例:
python
stack = []
stack.append(1)
stack.append(2)
stack.pop()
返回:2
(9)remove():删除指定值
格式:
python
list.remove(value)
示例:
python
x = ['a','b','c']
x.remove('b')
结果:['a','c']
注意:只删除第一次出现的值,不存在会报错
(10)reverse():反转列表
原地反转列表
示例:
python
x = [1,2,3]
x.reverse()
结果:[3,2,1]
特点:修改原列表;不返回结果
如果不想修改原列表可以使用
python
reversed()
示例:list(reversed(x))
(11)sort():排序
对列表进行排序
示例:
python
x = [4,6,2,1,7]
x.sort()
结果:[1,2,4,6,7]
特点:修改原列表;返回 None
如果不想修改原先的列表,可以使用sorted():生成排序副本
python
y = sorted(x)
特点:返回新列表;原列表不变
(12)sort() 高级参数
reverse
降序:
python
x.sort(reverse=True)
结果:[7,6,4,2,1]
key
指定排序规则
python
格式:list.sort(key=function)
示例:按照字符串的长度排序
words = ['add','a','aaaa']
words.sort(key=len)
结果:['a','add','aaaa']
4,元组
元组(tuple)是一种不可修改的序列。
与列表(list)类似:有序;支持索引和切片;可以存储多个元素。
4,1 创建元组
(1)使用逗号创建
元组最重要的标志是:逗号 (,)
python
1,2,3
结果:(1,2,3)
(2)使用括号创建
python
(1,2,3)
结果:(1,2,3)
注意:括号不是元组的核心,逗号才是。
4,2 空元组
python
创建空元组:()
结果:()
4,3 单元素元组
python
(42)
结果:42
这不是元组而是普通整数。
原因:Python 认为(42)只是数学括号
正确写法:
python
(42,)
结果:(42,)
单元素元组必须加逗号
4,4 元组拆包
元组可以直接赋值给多个变量
python
x,y,z = 1,2,3 等价于 (x,y,z) = (1,2,3)
访问:x[ ]
4,5 tuple() 函数
tuple() 可以将序列转换为元组
格式:
python
tuple(sequence)
字符串转换
python
tuple("abc")
结果:('a','b','c')
列表转换
python
tuple([1,2,3])
结果:(1,2,3)
如果参数本身是元组:
python
tuple((1,2,3))
不会复制,直接返回原元组
4,6 元组索引和切片
索引
python
x = (1,2,3)
x[1]
结果:2
切片
python
x[0:2]
结果:(1,2)
返回的仍然是元组
4,7 元组为什么不能修改
错误:
python
x = (1,2,3)
x[1] = 5
报错:TypeError
因为:元组不可变;创建后元素固定。
4,8 元组的应用场景
(1)字典key
字典的 key 必须不可变
python
point = (3,5)
# 可以作为key
(2)保护固定数据
python
point = (10,20)
这些不希望被修改的数据