列表的切片操作
创建列表的方式
-
创建列表的方式一:字面量语法
list1 = [‘apple’, ‘orange’, ‘pitaya’, ‘durian’]
print(list1) -
创建列表的方式二:构造器语法
list2 = list(range(1, 10))
print(list2) -
创建列表的方式三:生成式(推导式)语法
list3 = [i for i in range(1, 10)]
print(list3)
索引和切片
- 正向索引:0 ~ N - 1 / 负向索引:-N ~ -1
print(list4[2:4])
print(list4[-3:-1])
- 切片操作格式:
nums[start:end:step]
start:切片的开始位置,包括该位置。如:nums[start:]从该位置获取到len(nums)
end:切片的截止位置,不包括该位置。
step:步长
"""
example01 - 列表的切片操作
Author: Asus
Date: 2021/7/26
"""
import random
nums = [random.randrange(100) for _ in range(10)]
print(nums)
print(nums[2:])
print(nums[:])
print(nums[::-1])
print(nums[1:3]) # 左闭右开
print(nums[2:7:2])
print(nums[10:15]) # 超出索引不会报错
列表相关的运算
# 重复运算
list4 = [1, 10, 100] * 5
print(list4)
# 成员运算 --->in / not in ---> True / False
print(10 in list4)
print(5 not in list4)
# 合并
list5 = [1, 3, 5, 7]
list6 = [4, 4, 8]
list6.extend(list5)
# list6 += list5
print(list5)
# 比较
list7 = [1, 3, 5, 7]
list8 = [1, 3, 4, 8, 9]
print(list5 == list7)
print(list7 != list8)
# 比较两个列表对应元素的大小,
print(list7 < list8)
列表的内置函数
"""
example03 - 列表的相关操作
Author: Asus
Date: 2021/7/26
"""
ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
if 'strawberry' in ks:
print(ks.index('strawberry'))
if 'apple' in ks:
print(ks.index('apple'))
if 'apple' in ks:
print(ks.index('apple', 1))
append():在列表最后添加元素
insert():在列表指定位置插入元素
ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# 添加元素
ks.append('blueberry')
ks.insert(1, 'watermelon')
print(ks)
pop():默认删除最后一个元素
remove():删除指定的元素
ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# 删除元素
ks.pop()
ks.pop(4)
# del ks[0]
while 'apple' in ks:
ks.remove('apple')
print(ks)
clear():清空列表元素
ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
ks.clear()
print(ks)
统计元素在列表中出现的次数 —> count()
ks = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
print(ks.count('apple'))
附加:显示所有的汉字
"""
example04 - 显示所有的汉字
汉字的编码范围:0x4e00 ~ 0x9fa5
ord() ---> 查看字符对应的编码
chr() ---> 将编码处理成对应的字符
Author: Asus
Date: 2021/7/26
"""
# 显示所有的汉字
for i in range(0x4e00, 0x9fa6):
print(chr(i), end=' ')
ord() —> 查看字符对应的编码
chr() —> 将编码处理成对应的字符
print(ord('b')) # 查看字母的位置
print(ord('z'))
print('banana' < 'zoo') # 比较元素中字母的位置
print(ord('李'))
print(ord('王'))
print('李四' < '王五')
# 类型不一样的列表不能比大小,除非第一个元素就可以得出结果
items1 = ['apple', 'orange', 'pitaya', 'durian']
items2 = ['yes', 5, 6, 8, 9]
print(items1 < items2)
列表的排序
- sort():默认为升序,可以修改reverse参数控制升序和降序
- reverse():对列表的元素进行反转
"""
example05 - 排序
Author: Asus
Date: 2021/7/26
"""
items = ['banana', 'grape', 'apple', 'waxberry', 'pitaya', 'apple']
# items = items[::-1] # 进行反转
items.reverse() # 进行反转
print(items)
# 可以修改reverse参数控制升序或降序
items.sort(reverse=False) # 默认升序
print(items)
nums = ['1', '10', '234', '2', '35', '100']
nums.sort(key=int) # 以int类型输出
print(nums)
选择排序
- 确定最小值min_value
- 寻找是否有满足比min_value更小的数,如果有就和min_value对换位置
- 重复以上两步,直到输出满足条件的列表
"""
example06 - 排序(前提:没有sort函数)
Author: Asus
Date: 2021/7/26
"""
# 简单选择排序
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
for i in range(len(nums) - 1):
# 假设第一个元素就是最小值
min_value, min_index = nums[i], i
# 通过循环寻找有没有更小的值并记下它的位置
for j in range(i + 1, len(nums)):
if nums[j] < min_value:
min_value, min_index = nums[j], j
# 将最小的值换到最前面的位置
nums[i], nums[min_index] = nums[min_index], nums[i]
print(nums)
冒泡排序
冒泡排序对n个数据操作n-1轮,每轮找出一个最大(小)值。
操作只对相邻两个数比较与交换,每轮会将一个最值交换到数据列首(尾),像冒泡一样。
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
#nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
nums = [9, 1, 2, 3, 4, 5, 6, 7, 8]
for i in range(1, len(nums)):
swapped = False # 标记为未发生交换
for j in range(0, len(nums) - i):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
swapped = True
if not swapped:
break
print(nums)
随机抽取和乱序
- sample函数可以对列表元素进行无放回抽样
- choices函数可以对列表元素进行有放回抽样
- choice函数可以从列表中随机选择一个元素
- shuffle函数可以对列表进行乱序
"""
example08 - 随机抽取和乱序
Author: Asus
Date: 2021/7/26
"""
import random
nums = ['张三', '李四', '王五', '后裔', '狄仁杰', '李元芳']
# sample函数可以对列表元素进行无放回抽样
print(random.sample(nums, 2))
# choices函数可以对列表元素进行有放回抽样
print(random.choices(nums, k=5))
# choice函数可以从列表中随机选择一个元素
print(random.choice(nums))
# 进行乱序
random.shuffle(nums)
print(nums)
实例
- 输入三个整数,按照从大到小的顺序输出
"""
homework01 - 1. 输入三个整数,按照从大到小的顺序输出
Author: Asus
Date: 2021/7/24
"""
nums = []
for _ in range(3):
num = int(input('输入数据:'))
nums.append(num)
for i in range(1, len(nums)):
for j in range(len(nums) - i):
if nums[j] < nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
print(nums)
- 向列表中添加10个随机整数,找出其中第2大的元素
附加:列表的生成式(推导式)—> 写法简明,效率更高
nums = [random.randrange(1, 100) for _ in range(10)]
"""
homework02 - 2. 向列表中添加10个随机整数,找出其中第2大的元素
[a, b) --->random.random() * (b - a) + a
Author: Asus
Date: 2021/7/24
"""
import random
# nums = []
# for _ in range(10):
# num = random.randrange(1, 100) # 产生随机小数random.random()
# nums.append(num)
# 列表的生成式(推导式)---> 写法简明,效率更高
nums = [random.randrange(1, 100) for _ in range(10)]
# 推导式:产生1到100以内的奇数
# nums = [i for i in range(1, 101, 2)]
print(nums)
f_max_value, s_max_value = nums[0], nums[1] # 假设最大值与第二大值
if f_max_value < s_max_value:
f_max_value, s_max_value = s_max_value, f_max_value
for i in range(2, len(nums)):
if nums[i] > f_max_value:
f_max_value, s_max_value = nums[i], f_max_value
elif nums[i] == f_max_value:
pass
elif nums[i] > s_max_value:
s_max_value = nums[i]
print(s_max_value)
3.幸运的女人
"""
example09 - 幸运的女人
有15个男人和15个女人坐船出海,船坏了,需要把其中15个人扔到海里,其他人才能活下来;
所有人围成一圈,有某个人从1开始依次报数,报到9的人被扔到海里,下一个人重新从1开始报数,
直到将15个人扔到海里。最后,15个女人都幸存了下来,15个男人都被扔到了海里。
问原先哪些位置是男人,哪些位置是女人。
Author: Asus
Date: 2021/7/26
"""
persons = [i for i in range(1, 31)]
for _ in range(15):
persons = persons[9:] + persons[:8]
print(persons) # 输出去掉的元素后,剩下的元素
for i in range(1, 31):
print('女' if i in persons else '男', end=' ')
相比于上面代码更加通俗易懂,但是上面的代码更加简洁,可读性高
每一次数到9时,就把这个位置给去掉,然后又从1开始数,直到去掉15个位置。
persons = [True] * 30
index, counter, number = 0, 0, 0
while counter < 15:
if persons[index]:
number += 1
if number == 9:
persons[index] = False
counter += 1
number = 0
index += 1
if index == 30:
index = 0
for person in persons:
# 三元条件运算 ---> if后面的表达式为True,则取if前面的值,否则取else后面的值
print('女' if person else '男', end=' ')
4.用一个列表保存54张扑克牌,洗牌,按斗地主的发牌方式把牌发给三个玩家,
多的3张牌给第一个玩家(地主),把每个玩家手上的牌显示出来
先将后面的三个元素提取后,去掉这3个元素,然后再利用切片给每一位玩家赋值
"""
homework05 - 用一个列表保存54张扑克牌,洗牌,按斗地主的发牌方式把牌发给三个玩家,
多的3张牌给第一个玩家(地主),把每个玩家手上的牌显示出来
Author: Asus
Date: 2021/7/26
"""
import random
nums = []
for i in range(1, 14):
nums.append('方块' + str(i))
nums.append('梅花' + str(i))
nums.append('黑桃' + str(i))
nums.append('红心' + str(i))
# print(nums)
fs = ['大王', '小王']
pokers = nums + fs
random.shuffle(pokers)
print(len(pokers))
print(pokers)
player1 = []
player2 = []
player3 = []
nums = pokers[-1:-4:-1]
# print(nums)
for i in nums:
if i in pokers:
pokers.remove(i)
# print(pokers)
player1 = pokers[0:52:3]
player2 = pokers[1:52:3]
player3 = pokers[2:52:3]
player1 += nums
print(player1)
print(player2)
print(player3)
另一种想法:
import random
suites = ['黑桃', '红心', '梅花', '方块']
faces = ['A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
# 列表生成式(推导式)
cards = [f'{suite}{face}' for suite in suites for face in faces]
cards.append('小王')
cards.append('大王')
random.shuffle(cards)
# player1 = []
# player2 = []
# player3 = []
# 嵌套列表
# players = [[], [], []]
players = [[] for _ in range(3)]
for _ in range(17):
for player in players:
player.append(cards.pop())
players[0].extend(cards) # 最后三张牌给第一个玩家
for player in players:
player.sort(key=lambda x: x[1:])
for card in players:
print(card, end=' ')
print()
5.保存5个学生,3门课程的成绩
"""
example01 - 保存5个学生,3门课程的成绩
Author: Asus
Date: 2021/7/27
"""
import random
names = ['李白', '诸葛亮', '墨子', '孙悟空', '赵云']
courses = ['语文', '数学', '英语']
scores = [[random.randrange(50, 101) for _ in range(len(courses))] for _ in range(len(names)) ]
for i, name in enumerate(names):
for j, course in enumerate(courses):
print(f'{name}的{course}成绩:{score[i][j]}')
# 统计每个学生的平均成绩
for i, name in enumerate(names):
print(f'{name}的平均成绩:{sum(score[i]) / 3:.lf}')
# 统计每门课的最高分和最低分
for j, course in enumerate(courses):
temp = [scores[i][j] for i in range(len(names))]
# temp = [scores[i][0] for i in range(len(names))]
# temp = [scores[i][1] for i in range(len(names))]
# temp = [scores[i][2] for i in range(len(names))]
print(f'{course}的最高分:{max(temp)}')
print(f'{course}的最低分:{min(temp)}')