第四章-数据容器

五种数据容器分别为列表、元组、字符串、集合、字典 

数据容器

定义

列表一批可修改可重复的数据
元组一批不可修改可重复的数据
字符串一串字符串
集合一批不可重复的数据
字典一批可用key值检索value的数据

比较

是否支持下标索引是否支持重复元素是否可以修改
列表
元组
字符串
集合
字典key不可,value可以key不可,value可以

可以简单的理解为列表、元组、字符串这样的序列类型支持下标索引,支持重复元素。而集合、字典这样的非序列类型不支持下标索引和重复元素

通用操作

五种数据容器都支持for遍历,其中的列表,元组,字符串还支持while遍历。

len(容器)元素个数
max(容器)最大元素
min(容器)最小元素
list(容器)转换为列表
str(容器)转换为字符串
tuple(容器)转换为元组
set(容器)转换为集合
# 字典转列表、元组、集合只保留Key
# 字典转字符串保留key和value
dict1 = {"fhl": 99, "lij": 98, "zxl": 95}
print(f"{set(dict1)}")
# 进行容器的排序 sorted(容器,reverse=True)
mylist = [3, 1, 2, 5, 4]
print(f"列表排序结果是:{sorted(mylist)}")
# 无论什么类型,排序后都会变成列表对象
# 字典排序后丢失value
print(f"反向排序是:{sorted(mylist,reverse=True)}")

列表list[]

定义

在目前的学习中,老wolf是直接把列表当作C语言里的数组了

list 列表
字面量 [元素1, 元素2, 元素3, 元素4]
定义变量 变量名称 = [元素1, 元素2, 元素3, 元素4]
定义空列表 变量名称 = []     变量名称 = list()

 列表中可以存放字符串、数值、布尔值、列表

list1 = ["fhl", "zby", "zxl"]
print(list1)
print(type(list1))

list2 = ["fhl", 666, True]
print(list2)
print(type(list2))

list3 = [ [1, 2, 3], [4, 5, 6] ]
print(list3)
print(type(list3))

a = [(i, i ** 2) for i in range(10)]
print(a)

b = [i for i in range(10) if i % 2 == 0]
print(b)

常用操作

# 将函数定义为类class的成员,这些函数会被称为方法
# 函数的使用 num = add(1, 2)
class Student:
    def add(self, x, y):
        return x + y
# 方法的使用 student = Student()
# num = student.add(1, 2)

# 查询某元素下标
mylist = ["it", "fang", "fhl"]
index = mylist.index("it")
print(f"it的下标索引值是{index}")
# index2 = mylist.index("hello")
# print(f"hello的下标索引值是{index2}")

# 修改特定下标索引的值
mylist[0] = "good"
print(f"列表被修改后结果是{mylist}")

# 元素的插入
mylist.insert(1, "best")
print(f"插入后结果是{mylist}")

# 元素的追加
mylist.append(["1"])
print(f"append追加的结果是{mylist}")

# 元素的追加2,追加一批
mylist.extend(["2"])
print(f"extend追加的结果是{mylist}")

# 元素的删除
del mylist[4]
print(f"删除的结果是{mylist}")

# 元素的删除2
element = mylist.pop(4)
print(f"删除的结果是{mylist},删除的元素是{element}")

# 元素的删除,第一个匹配项
list2 = [10, 20, 30, 20, 30, 30]
list2.remove(20)
print(f"删除的结果是{list2}")

# 清空列表
mylist.clear()
print(f"列表被清空了,结果是{mylist}")

# 统计列表内某元素数量
count = list2.count(30)
print(f"列表中30的数量是{count}")

# 列表内元素数量总数
count = len(mylist)
print(f"列表中共有{count}个元素")

# 一般不用记下太多方法,要查阅相关文档
#  列表上限2的63次方-1个元素

遍历

for i in list:
    print(f"列表的元素有:{i}")

列表小结

列表名 = []定义空列表
列表名 = list()定义空列表
列表名.index(某元素)查询某元素下标
列表名[下标] = 300将下标处的元素值修改为300
列表名.insert(下标,值)将值插入到下标处
列表名.append(某元素)将某元素原样追加到列表后
列表名.extend([某])追加一批某
del 列表名[下标]删除元素
列表名.pop(下标)删除元素并将被删除的元素记录下来
列表名.remove(某元素)删除列表中出现的第一个某元素
列表名.clear()清空列表
列表名.count(某元素)统计列表内某元素数量
len(列表名)列表中元素数量总数
for i in 列表名:遍历列表,i为列表元素

元组tuple()

# 列表可以修改,元组一旦定义完成,就不可以修改
kong = tuple()
kong2 = ()
t1 = (1, "fhl", True)
print(f"t1的类型是:{type(t1)}")
print(f"kong的类型是:{type(kong)}")
print(f"kong2的类型是:{type(kong2)}")

t2 = (1, )
t3 = ("tuple", )
t4 = ("str")
print(f"t3的类型是{type(t3)}")
print(f"t4的类型是{type(t4)}")

t5 = ( (1, 2, 3), (4, 5, 6))
num = t5[1][2]
print(f"{num}")

t6 = ("乐", "哈哈哈哈")
index = t6.index("乐")
print(f"f6中乐的下标是{index}")

t7 = ("asdf", "hahaha", "good" ,"hahaha")
num = t7.count("hahaha")
print(f"f7中hahaha的数量为{num}个")

t8 = ("asdf", "hahaha", "good" ,"hahaha")
num = len(t8)
print(f"t8元组中的元素有{num}个")

# 元组的遍历while
index = 0
while index < len(t8):
    print(f"元组的元素有{t8[index]}")
    index += 1

# 元组的遍历for
for i in t8:
    print(f"2元组的元素有{i}")

# 元组是只读的,不可修改的。但可以修改元组内List的内容
t9 = (1, 2, ["fhl", "handsome"])
print(f"t9的内容是{t9}")
t9[2][0] = "帅哥"
t9[2][1] = "乐"
print(f"t9的内容是{t9}")

元组小结

如果元组中只有一个元素,那么它应该被写作

元组名 = (元素,)

如果写作

元组名 = (元素)

则不会被判定为元组

元组无法被修改,但元组中的列表可以被修改

index方法、count方法、len方法在元组中也能使用

字符串str""

# 字符串是字符的容器
mystr = "fanghanlin da shuaige"
# 通过下标取索引值
value = mystr[2]
value2 = mystr[-2]
print(f"从字符串{mystr}取下标为2的元素值为{value},下标为-2的元素值为{value2}")
# 字符串无法修改
# index方法
value = mystr.index("da")
print(f"在字符串{mystr}中查找da,起始下标为{value}")
# 字符串的替换,replace不是修改字符串本身,而是得到了一个新字符串
newstr = mystr.replace("da", "is")
print(f"将字符串{mystr},进行替换后得到{newstr}")
# 字符串的分割,split,字符串本身不变,而是得到了一个列表对象
mystr = "hello python fanghanlin"
mystrlist = mystr.split(" ")
print(f"将字符串{mystr}进行split切分后得到:{mystrlist},类型是{type(mystrlist)}")
# strip无参去除首尾空格和换行符
newmystr = mystr.strip()
print(f"字符串{mystr}被strip后,结果{newmystr}")
# strip有参去除
mystr = "12fanghanlin21"
newmystr = mystr.strip('12')  # 满足1或2就给去除了
print(f"字符串{mystr}被strip('12')后,结果{newmystr}")
# 统计字符串中某字符串的出现次数,count
mystr = "fanghanlin and fangfang"
count = mystr.count("fang")
print(f"字符串{mystr}中fang出现的次数是{count}")
#统计字符串的长度,len()
num = len(mystr)
print(f"字符串{mystr}的长度是{num}")

字符串的比较

本质上比的是ascii码

# 比较ASCII码
str2 = "viper"
str3 = "ziper"
str4 = "zipe"

if str2 > str3:
    print("str2>str3")
else:
    print("str2<str3")
if str3 > str4:
    print("str3>str4")
else:
    print("str3<str4")

字符串小结

字符串名[下标]找到对应下标,可为负数,为负数时从后往前
字符串.index("子串")查找字串并输出起始下标
字符串.replace("子串1","子串2")将字符串中的字串1替换为字串2
字符串.split("某符号")将字符串按某符号切割
字符串.strip('参数')有参去除
字符串.count('子串')数子串出现的次数
len(字符串)

字符串长度

集合set{}

# 定义集合
myset = {"good", "fang", "hanlin", "good", "fang", "hanlin", "good", "fang", "hanlin"}
mysetempty = set()
print(f"{myset}类型是{type(myset)}")
print(f"{mysetempty}类型是{mysetempty}")
# 集合是无序的,所以不支持下标索引访问,且不支持重复,但重复不会报错
# 集合和列表一样允许修改
# 添加新元素
myset.add("233")
print(myset)
# 移除元素
myset.remove("233")
print(myset)
# 随机取出元素
element = myset.pop()
print(f"被取出元素是{element},取出后集合为{myset}")
# 清空集合
myset.clear()
print(f"集合被清空了,集合为{myset}")
# 取两个集合的差集,之后两个原来的集合不变
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.difference(set2)
print(f"差集为{set3}")
# 取差集后消除差集
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set1.difference_update(set2)
print(f"消除差集后集合1{set1}")
print(f"消除差集后集合2{set2}")
# 合并
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.union(set2)
print(f"两个集合合并结果{set3}")
# 统计集合元素数量(集合是去重的)
set1 = {1,2,3,4,5,6}
num = len(set1)
print(f"集合内有{num}个元素")
# 集合的遍历
# 集合不支持下标索引,不用while
# 可以用for
for element in set1:
    print(f"集合中元素有{element}")

集合小结

remove、pop、clear、len、遍历用法与列表相同

集合名.add()添加元素
集合1.difference(集合2)取差集
集合1.difference_update(集合2)取差集后消除差集
集合1.union(集合2)集合合并

字典dict{key:value}

# python中的字典是通过key找到对应的value
# mydict = {key1:value1,key2:value2}
# 定义字典
dict1 = {"fhl": 99, "lij": 98, "zxl": 95}
dict1["zxl"] = 100
print(dict1)
# 定义空字典
dict2 = {}
dict3 = dict()
print(f"字典1的内容是{dict1},类型{type(dict1)}")
print(f"字典2的内容是{dict2},类型{type(dict2)}")
print(f"字典3的内容是{dict3},类型{type(dict3)}")

# 字典不允许key重复,会覆盖
# 字典没有下标索引,只能通过key找value
score = dict1["fhl"]
print(f"fhl的考试分数是{score}")
# 字典的key和value可以是任意数据类型,Key不可以是字典,所以字典可以嵌套
# 定义嵌套字典
stu_score_dict = {
    "fhl":{
        "语文": 90,
        "数学": 88,
        "英语": 82
    },
    "lij":{
        "语文": 80,
        "数学": 90,
        "英语": 85
    },
    "zxl":{
        "语文": 95,
        "数学": 92,
        "英语": 86
    }
}
print(f"学生考试信息{stu_score_dict}")
# 从嵌套字典获取数据
# 看一下lij的语文信息
score = stu_score_dict["lij"]["语文"]
print(score)
stu_score = {
    "fhl": 100,
    "lij": 98,
    "zxl": 95
}
# 新增元素
stu_score["lzl"] = 90
print(f"字典经过新增元素后,结果:{stu_score}")
# 更新元素
stu_score["fhl"] = 92
print(f"字典经过修改,{stu_score}")
# 删除元素
score = stu_score.pop("zxl")
print(f"删除了后结果为{stu_score},删除的是{score}")
# 清空元素
stu_score.clear()
print(f"字典被清空了,内容是:{stu_score}")
# 获取全部的key
mydict = {"fhl": 98, "lij": 96, "zxl": 95}
keys = mydict.keys()
print(f"字典的全部keys是:{keys}")
# 遍历字典
# 方式1 通过获取到全部的Key来完成遍历
for key in keys:
    print(f"字典的key是{key}")
    print(f"字典的value是{mydict[key]}")
# 方式2 直接对字典进行for循环,每一次循环都是直接得到Key
for key in mydict:
    print(f"2字典的key是{key}")
    print(f"2字典的value是{mydict[key]}")
# 字典没有下标,不用while
# 统计字典内元素数量
num = len(mydict)
print(f"字典中元素数量{num}个")
# 操作注意,新增和更新的语法一致,若Key不存在则新增,如果key存在即更新

经典作业题——判断一个字符串是否回文字符串

以下是五种方法

首先对输入的字符串进行预处理

str = input("请输入回文字符串")
str = str.translate(str.maketrans('', '', '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'))
str = str.strip().upper()

1.字符串逆序切片方法[::-1]

if str[::1] == str[::-1]:
    print(f"方法1:{str}是回文字符串")
else:
    print(f"方法1:{str}不是回文字符串")

2.for循环遍历并逐字符比较

digit = 0
for i in range(len(str)):
    if str[i] == str[len(str)-i-1]:
        digit += 1
if digit == len(str):
    print(f"方法2:{str}是回文字符串")
else:
    print(f"方法2:{str}不是回文字符串")

3.将字符串转换为list后利用列表的reverse()函数处理

def equ(a, b):
    for i in range(len(a)):
        if a[i] != b[i]:
            return False
    return True
a = list(str)
b = list(str)
a.reverse()
if equ(a, b):
    print(f"方法3:{str}是回文字符串")
else:
    print(f"方法3:{str}不是回文字符串")

4.使用reversed()函数将字符串反序

str2 = list(str)
reverse_str = list(reversed(str))
if equ(str2, reverse_str):
    print(f"方法4:{str}是回文字符串")
else:
    print(f"方法4:{str}不是回文字符串")

5.递归

def cut(str):
    if len(str) == 0 or len(str) == 1:
        return True
    if str[0] == str[-1]:
        return cut(str[1:-1])
    else:
        return False
if cut(str):
    print(f"方法5:{str}是回文字符串")
else:
    print(f"方法5:{str}不是回文字符串")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值