一.序列
基本概念
- 序列是Python中最基本的一种数据结构。序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引)并且序列中的数据会按照添加的顺序来分配索引
- 数据结构指计算机中数据存储的方式
序列的分类
- 可变序列(序列中的元素可以改变):例如 列表(list)
- 不可变序列(序列中的元素不能改变):例如 字符串(str)元组(tuple)
二.列表
- 列表是Python中的一个对象
- 列表的作用
(1)列表中可以保存多个有序的数据
(2)列表是用来存储对象的对象
lsc = ['Susan', 'Female', 19, [85, 74, (99, 89)]]
# 列表中的元素可以是字符串、数字、数组、元组
1.切片
- 切片是指从现有列表中获得一个子列表
- 通过切片来获取指定的元素
- 语法: 列表[起始 : 结束 : 步长]
- 通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素
- 起始位置和结束位置的索引可以不写
(1)如果省略结束位置, 则会从当前的开始位置一直截取到最后
(2)如果省略开始位置, 则会从第一个元素截取到结束的元素,但是不包括结束的元素
(3)如果开始位置和结束位置都省略, 则则会从第一个元素开始截取到最后一个元素 - 步长表示每次获取元素的间隔,默认是1(可以省略不写)
- 步长不能是0,但可以是是负数
字符串可以进行切片
# 字符串序列类型
s = 'Hello World!'
print(s[6:8]) # 根据序号[6:8]切片,输出不包括结束序号的字符'Wo'
print(s[:5]) # 从起点到序号为5的位置切片,不包括5,输出'Hello'
print(s[6:]) # 从序号6向后到字符串结束切片,输出'World!'
print(s[-3:-1]) # 负向索引,不包含右边界元素,输出'ld'
print(s[6:-1]) # 混用正负索引,输出'World'
print(s[::]) # 从字符串开始到结束进行切片,输出'Hello World!'
print(s[::-1]) # 按步长为-1进行切片,输出'!dlroW olleH'
print(s[::2]) # 步长为2,输出序号为偶数的元素,输出'HloWrd'
列表也可以进行切片
scores = ['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]
print(scores[5:]) # 从序号5到序列结束的元素,输出[96, 76, 65, 85, 98, 55]
print(scores[1:-1]) # 混用正负索引,输出[84, 80, 95, 88, 96, 76, 65, 85, 98]
print(scores[1::2]) # 步长为2,隔一个取一个数据,输出[84, 95, 96, 65, 98]
print(max(scores[1:])) # 切片返回除序号0的列表,max返回其最大值
print(sum(scores[1:])) # 利用sum()函数对切片获取的序列求和,输出822
2.列表的相关操作
(1)利用索引取出列表中的元素
# 字符串序列
s = 'Hello World!'
print(s[4]) # 按序号正向索引,返回序号为5的字符 'o'
print(s[-1]) # 按逆向序号索引,返回最后一个字符 '!'
# 序列类型 — 列表
scores = ['李明', 84, 80, 95, 88, 76, 65, 85, 98, 55]
print(scores[0]) # 按序号正向索引,返回序号为0的元素'李明'
print(scores[4]) # 按序号正向索引,返回序号为3的元素88
print(scores[-1]) # 按逆向序号索引,返回倒数第1个元素55
print(scores[-3]) # 按逆向序号索引,返回倒数第3个元素85
# 序列类型 — range
r = range(10) # 获得0,1,2,3,4,5,6,7,8,9的序列对象
print(r[3]) # 按序号正向索引,返回序号为3的元素 3
print(r[-3]) # 按逆向序号索引,返回倒数第3个元素 7
(2)查看列表的长度
scores = ['李明', 84, 80, 95, 88, 76, 65, 85, 98, 55]
print(len(scores)) # 10
(3)创建列表
- 创建空列表:
list = []
print(list) # []
- 创建特定序列的列表
# 创建1-10的数字列表:
list_1 = list(range(1, 11))
print(list_1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 创建连续的字符串
teachers = ['teacher_'+str(i) for i in range(1, 9)]
print(teachers) # ['teacher_1', 'teacher_2', 'teacher_3', 'teacher_4', 'teacher_5', 'teacher_6', 'teacher_7', 'teacher_8']
(4)列表常用操作(通用)
函数/符号 | 作用 |
---|---|
+ 和 * | + 可以将两个列表拼接成一个列表 * 可以将列表重复指定的次数 (注意两个列表不能够做乘法,要和整数做乘法运算) |
in 和 not in | in用来检查指定元素是否在列表当中 not in 用来检查指定元素是否不在列表当中 |
len() | 获取列表中元素的个数 |
max() | 获取列表中最大值 |
min() | 获取列表中最小值 |
list.index(x[, start[, end]]) | 第一个参数 获取指定元素在列表中的位置 第二个参数 表示查找的起始位置 第三个参数 表示查找的结束位置 |
list.count(x) | 统计指定元素在列表中出现的个数 |
ls = ['a', 'baa', 'bcde', 'de']
print(max(ls)) # 比较字符串中各字符的unicode值,d最大,输出de
print(min(ls)) # 比较字符串中各字符的unicode值,a最小,输出a
print(max(ls, key=len)) # 比较列表中各字符串长度,bcde最大
print(min(ls, key=len)) # 比较列表中各字符串长度,a最小,输出a
print(ls.count('a')) # 计算列表中'a'出现的次数:1
num = ['01', '9', '10', '5']
print(len(ls)) # 计算列表长度:4
print(max(num)) # 比较列表中各字符串长度,'9'最大
print(max(num, key=int)) # 按各元素转整型后比较,'10'转整型为 10,最大
(5)列表的方法
- append:列表最后一位插入数据
list = [1, 2]
list.append(3)
print(list) # [1, 2, 3]
- insert:列表中间插入数据
list = [1, 2, 3, 4, 5]
list.insert(2, 'hello')
print(list) # [1, 2, 'hello', 3, 4, 5]
- pop:根据索引删除元素
list = [1, 2, 3, 4, 5]
ls = list.pop(1)
print(list) # [1, 3, 4, 5]
print(ls) # 2
- remove:列表删除指定的元素
list = [1, 2, 3, 4, 5]
list.remove(3)
print(list) # [1, 2, 4, 5]
# 若元素不存在则会报错
- sort:列表正逆排序
student_name = ['Aardvark', 'book', 'coke', 'Dad', 'dog', 'Television', 'zappy', 'Zippy']
student_name.sort()
print(student_name)
# ['Aardvark', 'Dad', 'Television', 'Zippy', 'book', 'coke', 'dog', 'zappy']
student_name.sort(key=str.lower)
print(student_name)
# ['Aardvark', 'book', 'coke', 'Dad', 'dog', 'Television', 'zappy', 'Zippy']
参数key可以指定根据元素中指定的项进行排序
# 参数key可以指定根据元素中指定的项进行排序
name_age = [['Ana', 20], ['Bob', 18], ['Jack', 23], ['Tom', 21]]
name_age.sort()
print(name_age)
# [['Ana', 20], ['Bob', 18], ['Jack', 23], ['Tom', 21]]
name_age.sort(key=lambda x : x[1])
print(name_age)
# [['Bob', 18], ['Ana', 20], ['Tom', 21], ['Jack', 23]]
三.应用练习
- 现在有 a = [1,2,3,4,5,6] 不通过函数的形式实现列表的反转([6,5,4,3,2,1]) 并写出推导过程
a = list(range(1, 7))
print(a[::-1])
print(sorted(a, reverse=True))
- 给 用户9次机会 猜1 - 10 个数字随机来猜数字。如果随机的数字和用户输入的数字一致则表示正确,如果不一致则表示错误。最终结果要求用户怎么也猜不对
computer_choice = list(range(1, 11))
player = int(input('请输入1-10任意一个数字:\n'))
while 1:
print('错误')
if player in computer_choice:
computer_choice.remove(player)
if len(computer_choice) != 1:
player = int(input())
else:
print('正确答案:{}'.format(computer_choice[0]))
break
- 有两个列表 lst1 = [11, 22, 33] lst2 = [22, 33, 44]获取内容相同的元素
lst1 = [11, 22, 33]
lst2 = [22, 33, 44]
lst = []
for i in lst1:
if i in lst2:
lst.append(i)
print(lst)
- 现在有8位老师,3个办公室,要求将8位老师随机的分配到三个办公室中
import random
room = [[], [], []]
teachers = ['teacher_'+str(i) for i in range(1, 9)]
# 老师选教室
for i in teachers:
x = random.randint(0, 2)
room[x].append(i)
# 打印
print(room)
- 现在有8位老师,3个办公室,要求将8位老师随机的分配到三个办公室中,要求每个办公室至少有一个老师
import random
room = [[], [], []]
teachers = ['teacher_'+str(i) for i in range(1, 9)]
# 先让教室选老师
for i in range(3):
x = random.randint(0, len(teachers)-1)
room[i].append(teachers[x])
teachers.remove(teachers[x])
# 老师选教室
for i in teachers:
x = random.randint(0, 2)
room[x].append(i)
# 打印
print(room)