集合set + 几种简单算法 +str字符串

本文详细介绍了Python中的集合数据结构,包括其特点、创建方法、基本操作如添加、删除、交集和并集等,并提供了丰富的代码示例。此外,还探讨了简单的排序和查找算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合 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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值