集合 set
###1.概述
Python中的集合和数学上的集合是一致的
特点:不允许有重复元素,可以进行交集,并集和差集的计算
set和dict类似,和dict的区别在于:set相当于只存储了key
本质:无序而且无重复元素的集合
2.创建
list:[]
tuple:()
dict:{}
set:{}
代码演示:
#1。直接创建 s1 = {2,43,35} print(s1) print(type(s1)) #2.借助于set()创建集合 #类似于list() tuple() #2.1list s2 = set([34,4,6,4]) print(s2) #2.2tuple s3 = set((34,4,6,4)) print(s3) #2.3dict:只是通过key创建集合 s4 = set({1:10,2:20,3:30}) print(s4) #注意;set中可以自动过滤重复元素 #需求:删除列表中的重复元素 #方式一 list1 = [34,34,34,2,3,65,65] set1 = set(list1) list2 = list(set1) print(list2) #方式二: newList = [] for num in list1: if num not in newList: newList.append(num) print(newList)
3.操作
set是可变的
3.1添加元素
3.2删除元素
3.3遍历
3.4交集和并集
代码演示:
#1.添加元素 """ list:append extend insert dict: dict[key] = value """ #1.1add() 添加,在集合的末尾添加元素 s1 = {11,22,33} print(s1) s1.add(44) print(s1) #如果指定元素已经存在,则添加失败 s1.add(22) print(s1) #集合中也可以存储不同类型的数据 s1.add("hello") print(s1) #集合中不能通过add添加list和dict,因为list和dict是非哈希 #s1.add([55,66]) #print(s1) #s1.add({100:1,200:2}) #print(s1) #结论:集合中可以通过add添加元组,并且元组被当做一个整体添加进去 s1.add((55,66)) print(s1) #1.2update() 更新,打碎添加,只添加可迭代对象中的元素 s2 = {11,22,33} print(s2) #集合中不能通过update添加非可迭代的实体 #s2.update(44) #print(s2) #可迭代对象:字符串,列表,元组,字典 s2.update("hello") print(s2) s2.update([44,55]) print(s2) s2.update((66,77)) print(s2) s2.update({100:1,200:2}) print(s2) #注意:区分append和extend 区分add和update #2.删除;remove(),直接操作的是元素 s2.remove(55) print(s2) #3.交集和并集 s3 = {2,3,4,5} s4 = {4,5,6,7,8} #交集:&【按位与】 r0 = s3 & s4 print(r0) #并集:|【按位或】 r1 = s3 | s4 print(r1) #4.遍历 #注意:集合是无序的,没有索引 #list或者tuple:三种方式 #方式一:操作元素 for element in s2: print(element) #方式二:操作元素和编号 for i,element in enumerate(s2): print(i,element)
三、简单算法
1.排序
1.1冒泡排序
排序思路:比较两个相邻下标对应的元素,将数据从左向右排列,如果符合条件则交换位置,最值出现在最右边
代码演示:
#冒泡排序 list1 = [23,43,5,45,2,5,200,34,76,76,100] #以升序为例 #外层循环:控制比较的轮数 for out in range(0,len(list1) - 1): #内层循环:控制每一轮比较的次数,兼顾参与比较的下标 for inner in range(0,len(list1) - out - 1): #比较相邻下标对应的元素的大小,如果下标小的元素 大于 下标大的元素 ,则交换位置 if list1[inner] > list1[inner + 1]: #交换位置【交换两个变量的值】 list1[inner],list1[inner + 1] = list1[inner + 1],list1[inner] print(list1) """ range(0,len(list1) - out) IndexError: list index out of range #前提:以5个元素的列表为例 原因分析;当out取值为0,range(0,5),在for循环中,真正可以使用的inner值应该是0~4,当inner取值为4的时候, 则inner+1 = 5,出现了越界 解决方案:只要保证索引的最大值为4,此时,需要保证inner的最大值为3,则inner+ 1 = 4 range(0,len(list1) - out) ---- 》range(0,len(list1) - out - 1) """
1.2选择排序
排序思路:固定一个下标,然后用该下标对应的元素和其他的元素挨个进行比较,如果符合条件则交换位置,最值出现在最左边
代码演示:
#选择排序 list1 = [23,43,5,45,2,5,200,34,76,76,100] #以升序为例 #外层循环:控制比较的轮数 for out in range(0,len(list1) - 1): #内层循环:控制每一轮比较的次数,内外层循环同时兼顾参与比较的下标 for inner in range(out + 1,len(list1)): #比较:如果下标小的元素 大于 下标大的元素 ,则交换位置 if list1[out] > list1[inner]: list1[out],list1[inner] = list1[inner],list1[out] print(list1)
2.查找
2.1顺序查找
查找思路:遍历指定列表,把要查找的数据依次和列表中的每一位元素进行比较,如果相等,则表示查找到了
代码演示:
#顺序查找 list1 = [23,43,5,35,4,43] key = 43 #操作索引 for i in range(len(list1)): if key == list1[i]: print(i) #需求:自定义编程,求一个列表中的最大值 #假设法:假设列表中第0个元素为最大值,遍历列表,如果有其他的元素比假设还大的话,则给变量重新赋值 list1 = [23,43,5,35,4,43] #方式一 customMax = list1[0] for num in list1: if num > customMax: customMax = num print(customMax) #方式二 customMax = list1[0] for i in range(1,len(list1)): if list1[i] > customMax: customMax = list1[i] print(customMax) #需求:求一个列表中的第二大值和对应的下标 #思路:1.将原列表拷贝copy 2.对副本排序 3.拿到第二大值和原列表中的元素进行比对【顺序查找】 list2 = [52,100,34,5,46,100,56,43,100] newList = list2.copy() #拷贝的是实体,所以修改newList,对list2不会产生任何影响 for i in range(len(newList) - 1): for j in range(len(newList) - 1 - i): if newList[j] > newList[j + 1]: newList[j],newList[j + 1] = newList[j + 1] ,newList[j] print(newList) """ for index1 in range(len(list2)): if newList[-2] == list2[i]: print(i,list2[i]) """ #上面实现的缺点:没有考虑到最大值的重复 #优化需求:将最大值的个数考虑进来 #第一步:获取最大值 maxValue = newList[-1] #第二步:统计最大值的个数 count1 = newList.count(maxValue) #第三步:在升序排序的列表中,除去最大值之后,紧跟的元素就是第二大值 #[5, 34, 43, 46, 52, 56,100, 100, 100] -----》-4 ----->-(count1 + 1) secondValue = newList[-(count1 + 1)] for index1 in range(len(list2)): if secondValue == list2[i]: print(i,list2[i])
2.2二分法查找
前提条件:只能是排好序的列表【降序或者升序】
查找思路:通过折半来缩小查找范围,提高查找效率
举例:以升序为例,如果待查找的元素和中间下标对应的元素进行比较,如果待查找元素大于中间下标对应的元素,则说明待查找的元素肯定在列表的右边
代码演示:
#二分法查找 list1 = [5, 34, 44, 50, 55, 60,60,60, 70, 88, 100] #待查找的元素 key = 60 #初始值 #索引的最小值 left = 0 #索引的最大值 right = len(list1) - 1 #当查找的过程中,left和right是根据不同的条件进行慢慢靠拢,当left == right【临界条件】的时候,如果还没有找到待查找的元素, # 则说明列表中确实没有该元素 while left <= right: #计算中间的下标 middle = (left + right) // 2 #将待查找的元素和中间下标对应的元素进行比较 if key > list1[middle]: #更改查找的区间 left = middle + 1 #降序:right = middle - 1 elif key < list1[middle]: # 更改查找的区间 right = middle - 1 #降序:left = middle + 1 else: print("待查找元素的下标为:",middle) #如果循环还未结束,但是待查找的元素已经找到,则直接提前结束循环 break
四、String字符串
1.概述
字符串就是由零个或者多个字符组成的有限序列
使用单引号或者双引号括起来
字符:数字,字母,符号等
特点:字符串属于不可变的,一旦创建就不能改变值【在底层维护了一个不同字符的元组】
2.创建字符串
代码演示:
#str string str1 = "hello" str2 = 'hello' #Python中不支持单字符类型,所有的文本出现都是字符串 str3 = 'c'
3.字符串运算
3.1字符串连接
3.2重复输出字符串
3.3获取字符串中的字符
3.4截取字符串
3.5判断是否包含其他子字符串
代码演示:
#l.连接 + s1 = "welcome" s2 = " to 千锋" print(s1 + s2) #注意:只能字符串和字符串之间进行相加,表示拼接 #print(s1 + 10) #TypeError: must be str, not int #2.重复输出字符串 * print(s1 * 3) print(s1,s1,s1) #3.获取字符串中的字符 #语法:字符串名[索引] #注意:字符串的字符的访问和list或者tuple的用法类似的,也是通过索引访问 print(s1[3]) #4.截取字符串 s3 = "abcdefghjkloiuyytre" #指定区间【包头不包尾】 print(s3[1:5]) print(s3[:5]) print(s3[1:]) #倒序/反转 print(s3[::-1]) s4 = "abcd1234" print(s4[2:5]) #cd1 print(s4[2:]) #cd1234 print(s4[2::2]) #c13 print(s4[::2]) print(s4[-3:-1]) print(s4[-5::-1]) #5.判断是否包含指定子字符串 #成员运算符 #注意:子字符串必须在原字符串中是连续的,才表示存在 print("ab" in s4) #True print("ad" in s4) #False
4.格式化字符串
代码演示:
#格化式字符串:通过%改变后面字母的含义,%被称为占位符 """ %d:整型 %s:一切的对象 %f:浮点型 """ f = 12.345 num = 10 str1 = "hello" print("num = %.4d f = %.2f str1 = %s" % (num,f,str1)) print("num = %s f = %s str1 = %s" % (num,f,str1))
5.常用的转义字符
代码演示:
#转义字符 #通过\改变后面字母或者符号的含义 str1 = "\\" print(str1) str2 = "'" print(str2) str21 = '\'' print(str21) str3 = "today is a \"good\" day" print(str3) #\t:制表符 #\n;换行符 #\r:回车符 print("hello Python") print("hello\tPython") #如果字符串内部有很多处需要进行换行,直接使用\n比较麻烦,则用下面的方式代替 print("today is a good day") print("today\nis\na\ngood\nday") str4 = '''today is a good day ''' print(str4)
``
6.字符串功能
6.1计算长度和字符出现的次数
len()
count()
代码演示:
#字符串功能 #len() str1 = "ghsjghsj" print(len(str1)) #count(subStr[,start,end])返回指定子字符串在原字符串中出现的次数,可以指定一个查找的范围,默认从头到尾 #字符串名.count() str2 = "today is a good day today is a nice day today is a good day" c = str2.count("good",15,len(str2)) print(c) #字符串的遍历 for s in str1: print(s) for i in range(len(str1)): print(str1[i])