数据容器【序列】的切片
序列:是指内容连续,有序的,可以使用下标索引的一系列数据容器了。
切片:从一个大的序列,取出一个子序列就叫做切片操作。
语法结构:
序列[起始下标:结束下标:步长]
起始下标表示从何处开始,可以留空,留空作为从头开始。
结束下标(不含)表示何处结束,可以留空,留空视作取到结尾。
步长表示依次取元素的间隔:
步长为1,表示一个个取元素,步长为2,每跳过一个元素取,步长N表示跳过N-1个元素取,步长为负数表示反向取(起始下标,和结束下标也要反向标记)。
切片操作,不会影响到序列本身,而是回返回一个新序列。
示例
#对list进行切片
my_list=[0,1,2,3,4,5,6]
result1=my_list[1:4:1]#步长默认是1,可以不写
print(f"结果1是:{result1}")
#对tuple进行切片
my_tuple=[0,1,2,3,4,5,6]
result2=my_tuple[:]
print(f"结果2是:{result2}")
#对str进行切片
my_str="01234567"
result3=my_str[::2]
print(f"结果3是:{result3}")
#对str切片,从头开始,步数为-1
result4=my_str[::-1]
print(f"结果4是:{result4}")
#对列表切片从3开始到1结束,步长为-1
my_list=[0,1,2,3,4,5,6]
result5=my_list[3:1:-1]
print(f"结果5是:{result5}")
#对元组取子序列,步长为-2
my_tuple=(0,1,2,3,4,5,6)
result6=my_tuple=my_tuple[::-2]
print(f"结果6是:{result6}")
结果:
结果1是:[1, 2, 3]
结果2是:[0, 1, 2, 3, 4, 5, 6]
结果3是:0246
结果4是:76543210
结果5是:[3, 2]
结果6是:(6, 4, 2, 0)
练习:
my_str="万过薪月,员序程马黑来,nohtyP学"
new_my_str1=my_str[::-1][9:14]
print(f"逆序输出1:{new_my_str1}")
my_str="万过薪月,员序程马黑来,nohtyP学"
new_my_str2=my_str[5:10][::-1]
print(f"逆序输出1:{new_my_str2}")
my_str="万过薪月,员序程马黑来,nohtyP学"
new_my_str3=my_str.split(",")[1].replace("来","")[::-1]
print(f"逆序输出3:{new_my_str3}")
结果:
逆序输出1:黑马程序员
逆序输出1:黑马程序员
逆序输出3:黑马程序员
集合的定义与操作
列表可修改,支持重复元素且有序。元组、字符串不可修改、支持重复元素且有序。具有支持重复元素的局限,去重操作就不方便。
集合,不支持重复元素,且无序。
基础定义语法:
集合的性质解释和定义方法的验证
my_set={"传智教育","黑马程序员","itheima","传智教育","黑马程序员","itheima","传智教育","黑马程序员","itheima"}
my_set_empty=set()#定义空集合
print(f"my_set的内容是:{my_set},类型是“{type(my_set)}")
#由此可知集合不支持重复元素,且不能保证顺序
print(f"my_set_empty的内容是:{my_set_empty},类型是“{type(my_set_empty)}")
结果:
my_set的内容是:{'黑马程序员', 'itheima', '传智教育'},类型是“<class 'set'>
my_set_empty的内容是:set(),类型是“<class 'set'>
注意:集合是无序的,所以集合不支持下标索引访问,但是允许修改。
集合的操作
总结:
1.添加新元素.add()函数
#添加
my_set.add("Python")
my_set.add("传智教育")
print(f"my_set添加元素后的结果是:{my_set}")
结果:
my_set添加元素后的结果是:{'黑马程序员', 'Python', 'itheima', '传智教育'}
2.移除元素.remove()函数
#移除
my_set.remove("黑马程序员")
print(f"移除黑马程序员后的结果是{my_set}")
结果:
移除黑马程序员后的结果是{'Python', '传智教育', 'itheima'}
3.取出元素.pop()函数
列表中可以通过pop()指定下标索引取出。
而集合中不支持下标索引,所以随机取出值。
#取出
my_set={"传智教育","黑马程序员","itheima"}
element=my_set.pop()
print(f"集合被取出的元素为:{element},取出元素后还有{my_set}")
结果:
集合被取出的元素为:传智教育,取出元素后还有{'itheima', '黑马程序员'}
4.清空集合.clear()函数
#清空
my_set.clear()
print(f"集合被清空后的结果是:{my_set}")
结果
集合被清空后的结果是:set()
5.取两个集合的差集(集合1有,集合2没有的)
语法:集合1.difference(集合2)
结果:得出一个新集合,集合1和集合2不变。
#取出两个集合的差集
set1={1,2,3}
set2={1,5,6}
set3=set1.difference(set2)
print(f"取出差集后的结果是{set3}")
print(f"取出差集后,则原来的set1的内容为:{set1}")
print(f"取出差集后,则原来的set2的内容为:{set2}")
结果:
取出差集后的结果是{2, 3}
取出差集后,则原来的set1的内容为:{1, 2, 3}
取出差集后,则原来的set2的内容为:{1, 5, 6}
6.消除差集(消除两个集合的差集)
语法:集合1.difference_update(集合2)
结果:对比集合1和集合2,,在集合1中删除和集合2相同的元素,集合1被修改,集合2不变。
#消除两个集合的差集
set1={1,2,3}
set2={1,5,6}
set1.difference_update(set2)
print(f"消除差集后,集合1的结果:{set1}")
print(f"消除差集后,集合2的结果:{set2}")
结果:
消除差集后,集合1的结果:{2, 3}
消除差集后,集合2的结果:{1, 5, 6}
7.合并功能(使两个集合合并)
语法:集合1.union(集合2)
结果:得到一个新集合,集合1和集合2不变。
#合并
set1={1,2,3}
set2={1,5,6}
set3=set1.union(set2)
print(f"集合合并的结果:{set3}")
print(f"集合合并后,原有集合set1:{set1}")
print(f"集合合并后,原有集合set2:{set2}")
结果:
集合合并的结果:{1, 2, 3, 5, 6}
集合合并后,原有集合set1:{1, 2, 3}
集合合并后,原有集合set2:{1, 5, 6}
7.统计集合元素数量
语法:len(集合名)
#计算集合元素的数量len()
set1={1,2,3,4,5,1,2,3,4,5}
num=len(set1)
print(f"集合内的元素数量有{num}个")
结果:
集合内的元素数量有5个
8.集合的遍历
不支持下标索引,不能使用while循环,可以用for循环。
#集合的遍历
set1={1,2,3,4,5}
for element in set1:
print(f"集合的元素有{element}")
结果:
集合的元素有1
集合的元素有2
集合的元素有3
集合的元素有4
集合的元素有5
集合的总结:
可以容纳多个数据
可以容纳不同类型的数据(混装)
数据是无序存储的。不支持下标索引
不允许重复数据存在
可以修改
支持for循环遍历,不支持while循环遍历
集合练习:
用for循环遍历列表,存入集合,再遍历集合打印。
my_list=['黑马程序员','传智播客','黑马程序员','传智播客','itheima','itcast','itheima','itcast','best']
set1=set()
for item in my_list:
set1.add(item)
for element in set1:
print(f"存入集合的结果有{element}")
结果:
存入集合的结果有黑马程序员
存入集合的结果有itheima
存入集合的结果有best
存入集合的结果有itcast
存入集合的结果有传智播客
不积跬步无以至千里,不积小流无以成江海。