学习python第十一天
Posted 不吃 西红柿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习python第十一天相关的知识,希望对你有一定的参考价值。
学习python第十一天
一周总结
本周我们主要学习来一下内容
-
列表
-
元组
-
字符串
-
集合
-
字典
主要学习掌握他们的各项操作和功能
首先是列表
列表
列表支持,增、删、改、查等功能,
切片
-
语法------>[start : end: step]
-
切片类别:局部切片,全部切片,有步长和无步长,还有反向切片
运算
-
重复运算------>输出列表
-
成员运算------>输出布尔值
-
合并运算------->输出列表
-
比较------------>输出布尔值
功能
-
添加元素常用的两种方法----->instert, appdend
-
删除元素常用的两种方法----->pop, remove
-
清空列表--------------------------->clear
-
切片也算查找元素,还有索引查找
使用列表
-
反转列表
使用反向切片, 或者直接使用函数
items = items[::-1] print(items) items.reverse() print(items)
-
给列表排序
注意要求正序还是倒序
默认为正序
items.sort(reverse=False) print(items) items.sort(reverse=True) print(items)
-
格式化定义列表
- 直接循环一个数字区间
- 有条件的从一个数字区间挑选
- 从一个数字区间随机挑选
nums = [i for i in range(1, 10)] nums = [i for i in range(1, 100) if i % 5 == 0 or i % 3 == 0] nums = [random.randrange(1, 100) for _ in range(10)]
练习
- 简单选择排序------>每次从剩下的元素中选择最小值
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
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)
-
冒泡排序------>元素两两比较,如果前面的元素大于后面的元素,就交换两个元素的位置
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]加上一个条件识别是否提前将列表排好序
nums = [2, 3, 4, 5, 6, 7, 8, 9, 1]排一次即可
通过验证第二次循环时有无元素交换位置推测列表是否将顺序排好
例如特殊情况
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
for i in range(1, len(nums)):
swapped = False
for j in range(0, len(nums) - i):
if nums[j] > nums[j + i]:
nums[j], nums[j + i] = nums[j + i], nums[j]
swapped = True
if not swapped:
break
print(nums)
抽样和乱序
-
函数无放回抽样sample
-
函数可以对列表多个元素元素同时进行又放回抽样,(可以重复抽中)choices
-
函数可以从列表中随机抽取一个元素choice
-
使用函数将列表中元素顺序随机打乱,random.shuffle()
元组
不可变的容器,注意一元组一定要有一个逗号否则会被认为是一个字符串,元组只支持查看,
运算
元组的运算不会改变原有元组只会形成新的元组, 与列表输出效果相同
- 成员运算
- 重复运算
- 合并运算
其他
-
索引和切片(与列表格式相同)
-
查找元素所在的索引 fruits3.index()
-
计算元素在元组中出现的次数 fruits3.count()
字符串
注意:字符串也是不变数据类型,只能进行读操作,不能进行改写操作
运算
字符串的运算不会改变原有元组只会形成新的字符串, 与列表输出效果相同
- 重复运算
- 成员运算
- 比较运算
字符串的操作
大小写转换
-
转大写
print(a.upper()) -
转小写
print(a.lower()) -
首字母大写
print(a.capitalize()) -
每个单词首字母大写
print(a.title())
检测字符串
-
在字符串中查找有没有某个子串的操作
- index / rindex
- find / rfind
字符串放置
# 居中
print(a.center(80, '='))
# 右对齐
print(a.rjust(80, '='))
# 左对齐
print(a.ljust(80, '='))
b = '1234'
# 零填充(在左边补0)
print(b.zfill(6))
# 修建左边空格
print(email.strip())
# 袖箭右边空格
print(email.rsplit())
# 将指定的内容用。。。替换
print(meat.lstrip('替换内容').replace('替换内容', '*'))
分解和连接字符串
content = 'You go your way, I will go mine.'
content2 = content.replace(',', '').replace('.', '')
# 去掉字符串中的指定元素,这里是逗号和句号
print(content2)
# 拆分字符串
words = content2.strip()
for word in words:
print(word)
# 用逗号拆分字符串
words = content2.strip(',')
for word in words:
print(word)
# 用空格拆分字符串,最多拆分三次
items = content2.split(' ', maxsplit=3)
print(items, len(items))
# 从右到左用空格拆分字符串,最多拆分三次
item = content2.rsplit(' ', maxsplit=3)
print(item, len(items))
contents = [
'请不要相信我的美丽',
'更不要相信我的爱情',
'因为在涂满油彩的面孔下',
'有着一颗戏子的心'
]
# 将列表中的元素用指定的字符串连接起来
print(','.join(contents))
转换字符串编码
编码:把一种字符串集转换成另外一种字符集
解码:把一种字符集转换成另外一种字符串集
要点:
1、选择字符集编码时,最佳选择也是默认的是utf-8编码
2、编码和解码的字符集要保持一致,否则会出现乱码现象
3、不能用ISO-8859-1编码保存中文,否则会出现编码黑洞,中文变成问号
4、UTF-8是Unicode的一种实现方案, 也是一种变长的编码,最少一个字节,最多四个字节,表示中文用三个字节
5、如果编码和解码的方式不一样,python中可能会产生UnicodeDecodeError异常
6、也有可能出现乱码现象
字符串加密
例如凯撒密码
凯撒密码 - 通过对应字符的替换,实现对明文进行加密的一种方式
abcdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyzabc
明文:attack at dawn
密文:dwwdfn dw gdzq
对称加密: 机密和解密使用了相同的密钥
非对称加密: 加密和解密使用不同的密钥(公钥、私钥)---->适合互联网应用
message = 'attack at dawn'
# 生成字符串转换的对照表
table = str.maketrans('abcdefghijklmnopqrstuvwxyz',
'defghijklmnopqrstuvwxyzabc')
# 字符串的translate方法实现字符串转换
print(message.translate(table))
集合
集合的定义和中学时学习的集合定义大致相同
集合的运算
-
成员运算------>输出布尔值
-
交集运算------->set1 & set2、、set1.intersection(set2
-
并集运算------->set1 | set2、、set1.union(set2)
-
差集运算------->set1 - set2、、set1.difference(set2)
-
对称差---------->set1 ^ set2、、(set1 | set2) - (set1 & set2)、、set1.symmetric_difference(set2)
集合的操作
set1 = {'apple', 'banana', 'strawberry'}
print(set1)
# 添加元素
set1.add('blueberry')
set1.add('waxberry')
print(set1)
# 删除元素(随机)
print(set1.pop())
print(set1)
# 删元素,指定删除
set1.discard('apple')
# 清空集合
set1.clear()
字典
元素由键和值构成,冒号前面称为键,冒号后面称为值
创建字典语法
-
字面量语法
-
构造器语法
-
生成式语法
遍历字典
- 遍历字典中的键
- 遍历字典中的值
- 遍历字典中的键和值
字典的相关操作
注意:
1、字典的索引运算放在赋值运算的左边,
2、如果索引对应的键存在,就更新它的值
3、如果字典中没有对应的索引,就增加一组新的键值对
4、合并键值对,相同的键就更新
5、删除元素, 键必须要存在否则会报错
# 默认删除最后一项
dict1.popitem()
# 清空字典
dict2.clear()
print(dict1)
dict1.setdefault('C', 800) # 这里没啥用
print(dict1)
dict1.setdefault('F', 1000) # 这里加入一个键值对
print(dict1)
相关题目总结
选择几个典型的讲解
简单排序
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)
冒泡排序
nums = [35, 12, 99, 58, 67, 42, 49, 31, 73]
for i in range(1, len(nums)):
for j in range(0, len(nums) - i):#循环n-1ci
if nums[j] > nums[j + i]:#比较大小
nums[j], nums[j + i] = nums[j + i], nums[j]#把大的放在后面
print(nums)
#特殊情况
nums = [9, 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 + i]:
nums[j], nums[j + i] = nums[j + i], nums[j]
swapped = True
if not swapped:
break
print(nums)
nums = [2, 3, 4, 5, 6, 7, 8, 9, 1]
for i in range(1, len(nums)):
swapped = False
for j in range(0, len(nums) - i):
if nums[j] > nums[j - i]:
nums[j], nums[j - i] = nums[j - i], nums[j]
swapped = True
if not swapped:#当swapped不再改变是,即为False时结束
break
print(nums)
幸运的女人问题
15个男人和15个女人同时在一艘船上在海里。现在船坏了,需要将15个人扔下去,其他的15个人才能获救。,于是把15个男人和15个女人顺序打乱围成一个圆圈。。指定一个人为第一个。从一数到九。数到第九的那个人就被扔下海里。求与人的位置是什么,才能保证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
pass
index += 1
if index == 30:
index = 0#当最后一个人报完数后,索引又从头开始
for person in persons:
# if person:
# print('女', end='')
# else:
# print('男', end='')
# 三元条件运算----->if后面的表达式为True,取if前面的值, 否则取else后面的值
print('女' if person else '男', end='')#相当于上面注释部分
#简化版
person = [i for i in range(30)]#将30个人依次放入列表
for _ in range(15):
person = person[9:0] + person[:8]#每隔9切片,将9前后的列表切片相加,前面的放在后面,形成一个新的列表再次以相同的方式切片,循环15次即可
for i in range(1, 31):
print('女' if i in person else '男', end='')
发牌问题
import random
porke_numbers = [i for i in range(2, 11)]
flower_porkes = ['A', 'J', 'Q', 'K']
porke_numbers += flower_porkes
#确定相同花色的牌种扑克牌种类,2~10、AJKQ
# print(porke_numbers)
porke_nums = []
color_porkes = ['♥', '♣', '♦', '♠']#花色,使用计算机自带输入法可以打出来
for color_porke in color_porkes:#遍历花色
for porke_number in porke_numbers:#遍历扑克数字
porke_nums.append(color_porke + str(porke_number))#将花色和数字组合
# porke_nums.append(f'{color_porke}{porke_number}')
# porke_nums = [f'{color_porke}{porke_number}' for color_porke in color_porkes for porke_number in porke_numbers ]
porke_nums.append('大王')
porke_nums.append('小王')
# print(porke_nums)
random.shuffle(porke_nums)#使用打乱列表元素顺序
# print(porke_nums)
# print(len(porke_nums))
# player1.append(porke_nums[51:54])
# print(player1)
player1 = []
player2 = []
player3 = []
for i in range(0, len(porke_nums) - 3, 3):#减三将后面三张给第一个玩家
player1.append(porke_nums[i])# 循环一次取三张扑克,所以循环步长为三
player2.append(porke_nums[i + 1])
player3.append(porke_nums[i + 2])
player1 += porke_nums[52:54]#,将后面三张给第一个玩家
# for _ in range(17):
# player1.append(porke_nums.pop())
# player2.append(porke_nums.pop())
# player3.append(porke_nums.pop())
# player1 += porke_nums
# player1.extend(porke_nums)
player1.sort(key=lambda x: x[1:])#这里可以不知道原理,知道作用就行,后面才会学到,作用是比较发到手里扑克大小将其整理好
player2.sort(key=lambda x: x[1:])
player3.sort(key=lambda x: x[1:])
for card in player1:
print(card, end=' ')
print()
for card in player2:#遍历玩家手里的扑克将其输出
print(card, end=' ')
print()
for card in player3:
print(card, end=' ')
print()
#简化输出格式
去重复元素
nums = [2, 3, 4, 5, 6, 7, 8, 9, 4, 5, 5, 3, 3, 8, 6, 9]
counts = []
for num in nums:
if num not in counts:# 如果原列表中的元素,空列表里面没有,就往空列表里添加这元素,
counts.append(num)
print(counts)
找出现次数最多的重复元素
注意:可能不止一个
nums = [2, 3, 4, 4, 4, 5, 6, 7, 8, 9, 4, 5, 5, 3, 3, 8, 6, 3, 3, 4]
sum = []#定义空列表装出现最多的元素
max_apper = nums.count(nums[1])#首先假定第一个元素出现次数最多
for num in nums:#循环列表一次比较各个元素出现的次数
if max_apper < nums.count(num):#将出现次数多的次数赋值给初始值
sum.clear()#找到新的出现最多的元素就要把以前存起来的元素清理掉
max_apper = nums.count(num)#将新元素装进列表
sum.append(num)
elif max_apper == nums.count(num):
if num not in sum:#如果找到与目前最多出现次数相同的,且不是同一个元素,就一同放进列表,
sum.append(num)
print(f',出现最多的元素是{sum}输出了{max_apper}次')
杨辉三角形
nums = [1]
for _ in range(0, 以上是关于学习python第十一天的主要内容,如果未能解决你的问题,请参考以下文章