Python-容器类型


前言

容器类型是用于存储和组织数据的内置数据结构


一、列表(list)

1. 定义

  • 可以存储各种不同类型数据(int, float, complex, str, bool, Nonetype)
  • 有序项目集合,可以用索引取值
  • 可变数据类型
mylist1 = [1, 'a', 1.1, True, None, 1 + 1j]
print(id(mylist1), mylist1)		# 2969956051776 [1, 'a', 1.1, True, None, (1+1j)]
print(id(mylist1[0]), mylist1[0])	   # 140710721755576 1
print(id(mylist1[1]), mylist1[1])	   # 140710721789152 a

# 依次取出列表中的所有数据
# for, while
for item in mylist1:
    print(item)
# emumerate => 生成出(index,value)格式的数据,如(1, 'a')
for item in enumerate(mylist1):
    print(item)



# 可以索引取值: 跟str的取值方式一样
# mylist1[start:end:step]
print(mylist1[:-5:-1])		# ['g', 'f', 'e', 'd']

# 列表的计算(+, *)
mylist2 = [1, 2, 3] + [4, 5, 6]
print(mylist2)	# [1, 2, 3, 4, 5, 6]

mylist3 = [1, 2, 3] * 3
print(mylist3)	# [1, 2, 3, 1, 2, 3, 1, 2, 3]

2. 可变性

mylist1[0] = 2
print(id(mylist1[0]), mylist1[0])	   # 140710721755608 2

# str -> list
mystr = "abcdefg"
mylist1 = list(mystr)
print(mylist1)	# ['a', 'b', 'c', 'd', 'e', 'f', 'g']

3. 常用方法

1. append

追加元素 一个元素

mylist4 = [1, 2, 3]
mylist4.append(4)
mylist4.append([5, 6])
print(mylist4)	# [1, 2, 3, 4, [5, 6]]

# 注意
# append() 方法是用来直接修改原列表的,它的返回值是 None,而不是修改后的列表
mylist = mylist.append(4)
print(mylist4)	 # None

mystr = "abcdefg"
mystr = mystr.replace("a", "o")
print(mystr)	 # obcdefg

2. extend

扩展元素,extend的参数是一个可迭代对象(字符串,list,元组…)

mylist4.extend([7, 8, 9])
print(mylist4)	# [1, 2, 3, 4, [5, 6], 7, 8, 9]

3. remove

删除元素

mylist4.remove(7)
print(mylist4)	# [1, 2, 3, 4, [5, 6], 8, 9]

4. pop

按下标删除(默认删除最后一个)

mylist4.pop(-2)
print(mylist4)		# [1, 2, 3, 4, [5, 6], 9]

item = mylist4.pop(-2)
print(item, mylist4)	# [5, 6] [1, 2, 3, 4, 9]

5. len

统计元素个数

print(len(mylist4))	# 5

6.count

指定元素在列表中出现几次

print(mylist4.count(3))	# 1

7. index

指定元素在列表中第一次出现的下标位置(如果不存在会报错)

print(mylist4.index(3))	# 2

8.insert

在指定位置插入元素

my_list = [1, 2, 3]
my_list.insert(1, "a")   # 在索引 1 处插入 "a"
print(my_list)  		 # [1, 'a', 2, 3]

9. sort

排序(列表内部的元素类型一致,可以进行>,<比较)

mylist = [1, 5, 6, 2, 3, 7]
mylist.sort()
print(mylist)	 # [1, 2, 3, 5, 6, 7]

10.reverse

反转 逆序排列

mylist4.reverse()
print(mylist4)	 # 

11.clear

清空列表

mylist4.clear()
print(mylist4)		# []

二、元组(tuple)

1. 定义

  • 元组和列表的区别,列表是可变的,元组是不可变的(防止误修改)
  • 有顺序的项目集合
  • 可以存储各种不同类型的对象
  • 不可变对象
mytuple = (1, 1.1, 'a', True, None, [1, 2], (1, 1))
# 注意!!! 元组中如果只有一个元素,必须要加一个逗号
mytuple = (1)
print(type(mytuple))	# <class 'int'>
mytuple = (1,)
print(type(mytuple))	# <class 'tuple'>

2. 不可变性

# 元组是不可变的
# TypeError: 'tuple' object does not support item assignment
# mytuple[0] = 2

# 探讨可变性
mylist = [(1, 2), 3, 4]
mylist[0] = 2
# mylist[0][1] =22
# TypeError: 'int' object does not support item assignment

mytuple = ([2, 3], 4)
# mytuple[0] = 2
# TypeError: 'tuple' object does not support item assignment
mytuple[0][1] = 22

3. 列表元组转换

list, tuple

mytuple = (1, 2)
mylist = list(mytuple)
print(mylist, type(mylist))		# [1, 2] <class 'list'>
mylist = [1, 2]
mytuple = tuple(mylist)
print(mytuple, type(mytuple))	# (1, 2) <class 'tuple'>

三、字典(dict)

1. 定义

  • key-value键值映射数据结构
  • 可变对象
  • key:必须是可hash对象(不可变对象->基础数据+元组),不可以重复
  • value: 可以是任何数据
mydict = {}
mydict = dict()
print(type(mydict))	# <class 'dict'>

mydict = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4"
}
print(type(mydict))	# <class 'dict'>

userinfo = {"name": "cici", "score": [1, 2, 3, 4, 5]}

dict1 = {1: 100}
dict2 = {(2, 3): 100}
# 可hash=> 创建好之后不可以改=>不可变对象
# 不可hash=> 创建好之后可以修改=>可变对象
# TypeError: unhashable type: 'list'
# dict3 ={[2,3]:100}

2. 取值

userinfo = {"name": "cici", "score": {"yuwen": 100, "shuxue": 100}}
print(userinfo["name"])	# cici
print(userinfo['score']["yuwen"])	# 100

# KeyError:'a'
# print(userinfo["a"])
# get 方法通过key取值,如果key不存在,返回默认值
print(userinfo.get("a", 0))		# 0
print(userinfo.get("name", "nothing"))	# cici

3.修改数据

# 当key不存在时,相当于新增加一个key-value
userinfo["age"] = 20
print((userinfo))	# {'name': 'cici', 'score': {'yuwen': 100, 'shuxue': 100}, 'age': 20}
# 当key存在时,相当于修改key对应的value
userinfo["age"] = 30
print((userinfo))	# {'name': 'cici', 'score': {'yuwen': 100, 'shuxue': 100}, 'age': 30}
# 删除数据
del userinfo["age"]
print(userinfo) 	# {'name': 'cici', 'score': {'yuwen': 100, 'shuxue': 100}}

4. 判断成员关系

# 判断是否存在name这个key
print("name" in userinfo)	# True
# 判断是否存在cici这个value
print("cici" in userinfo.values())	# True

print(userinfo.values())	# dict_values(['cici', {'yuwen': 100, 'shuxue': 100}, 30])
print(userinfo.keys())	# dict_keys(['name', 'score', 'age'])
print(userinfo.items())	# dict_items([('name', 'cici'), ('score', {'yuwen': 100, 'shuxue': 100}), ('age', 30)])

5. 遍历字典

for key in userinfo:
    print(key)	# name score age
for value in userinfo.values():
    print(value)	# cici {'yuwen': 100, 'shuxue': 100} 30
for key, value in userinfo.items():
    print(key, value)	
    # name cici 
    # score {'yuwen': 100, 'shuxue': 100} 
    # age 30

四、集合(set)

1. 定义

只有key的容器,key必须是可hash对象,天生去重
{1,2,3}

s1 = {1, 2, 3, 2, 4}
print(s1, type(s1))	# {1, 2, 3, 4} <class 'set'>

# TypeError: unhashable type: 'list'
# s2 = {[1,2]}
# print(s2,type(s2))

# 去重
s3 = set("abcdabcdabcd")
print(s3, type(s3), "".join(s3))	# {'a', 'd', 'b', 'c'} <class 'set'> adbc

s4 = set([1, 2, 3, 4, 1, 1, 2, 3, 4, 6])
print(s4, type(s4), list(s4))	# {1, 2, 3, 4, 6} <class 'set'> [1, 2, 3, 4, 6]

2. 添加或删除数据

# 给集合添加数据
s4.add(8)
print(s4, type(s4))	# {1, 2, 3, 4, 6, 8} <class 'set'>

# 删除
s4.remove(4)
print(s4, type(4))	# {1, 2, 3, 6, 8} <class 'set'>

3. 运算

s1 = {1, 2, 3}
s2 = {1, 2, 4}
# 并集:
print(s1 | s2)	# {1, 2, 3, 4}

# 交集:&
print(s1 & s2)	# {1, 2}

# s1-s2:在s1中,不在s2中
print(s1 - s2)	# {3}
print(s2 - s1)	# {4}

# 对称差集
print(s1 ^ s2)	# {3,4}

总结

      容器类型是 Python 中用于存储多个元素的对象,其核心特点是支持元素存在性检查,理解容器类型的特点和适用场景,有助于高效处理数据和编写清晰的代码
      容器类型是一个更宽泛的概念,任何能判断元素是否存在的对象都可以称为容器
      序列是容器的一种特定形式,强调元素的有序性和可迭代性


练习

1. 找出最长子串

  • 连续字符:找出字符串中最长的重复字符
  • 如aaabbbbb => bbbbb
# 定义最长连续子串的起始字符和长度
s = input("请输入连续字符:")
max_char = s[0]
max_length = 1
current_char = s[0]
current_length = 1
# 从第二个字符开始遍历
for c in s[1:]:
    if c == current_char:
        current_length += 1
        if current_length > max_length:
            max_length = current_length
            max_char = current_char
    else:
        current_char = c
        current_length = 1
print(f"{s}的最大子串为:{max_char * max_length}")

2. 定义一个列表,找出列表中是最大值、最小值、平均值(不用函数min,max)

list = [1, 3, 6, 4, 8, 5, 9, 7, 2]
min = max = sum = list[0]
for num in list[1:]:
    if num > max:
        max = num
    elif num < min:
        min = num
    sum += num
avg = sum / len(list)
print(f"最小值:{min}, 最大值:{max}, 平均值:{avg}")

list = [1, 3, 6, 4, 8, 5, 9, 7, 2]
mylist.sort()
sum = 0
min = mylist[0]
max = mylist[-1]
for i in mylist:
    sum += i
avg = sum / len(mylist)
print(f"最小值:{min}, 最大值:{max}, 平均值:{avg}")

3. 商品管理系统

A. 打印一个选择菜单:

  1. 显示商品信息 -> 用友好的方式将商品信息打印出来
  2. 增加或删除库存 -> 要用户输入商品id,增加库存量 p001, 10
  3. 删除商品 -> 要用户输入商品id
  4. 退出

B. 用户输入选择

  • 根据用户的输入完成对应的菜单功能
  • 用户可以进行N次操作,直到输入4

C. 注意:

  • 用户输入不合法
  • 如何保证代码的健壮性
menu = (
    "输入1: 显示商品信息",
    "输入2: 增加或删除库存",
    "输入3: 删除商品",
    "输入4: 退出"
)
pro_info = {
    "p001": {"name": "苹果", "price": 5, "store": 100},
    "p002": {"name": "香蕉", "price": 4, "store": 150},
    "p003": {"name": "橘子", "price": 2, "store": 200},
}
print("\n=== 商品管理系统 ===")
print("\n".join(menu))
while True:
    try:
        option = int(input("请输入你的选择(1-4),按4退出:"))
        if option not in {1, 2, 3, 4}:
            print("请正确输入有效数字(1-4)")
    except Exception as e:
        print("请正确输入有效数字(1-4)", e)
        continue
    if option == 1:
        print("\n===商品信息===")
        print(f"商品ID  商品名   单价     库存 ")
        for item in pro_info:
            print(f"{item}    {pro_info[item]['name']}     {pro_info[item]['price']}      {pro_info[item]['store']}")
    elif option == 2:
        print("\n===增加或减少库存===")
        print("例如:增加10个p001的库存量  输入:p001,10")
        print("     减少10个p001的库存量  输入:p001,-10")
        pid = input("请输入要增加或减少库存id:")
        found = False
        if pid in pro_info:
            found = True
        if found:
            pid, pcount = input("请输入商品id,库存变更信息:").split(',')
            pcount = int(pcount)
            print(pid, pcount)
            pro_info[pid]["store"] += pcount
            print(f"商品ID  商品名   单价     库存 ")
            for item in pro_info:
                print(
                    f"{item}    {pro_info[item]['name']}     {pro_info[item]['price']}      {pro_info[item]['store']}")
        else:
            print("商品id不存在")
    elif option == 3:
        print("===删除商品===")
        pid = input("\n请输入要删除的商品id:")
        found = False
        if pid in pro_info:
            found = True
        if found:
            pro_info.pop(pid, None)
            print(f"商品ID  商品名   单价     库存 ")
            for item in pro_info:
                print(
                    f"{item}    {pro_info[item]['name']}     {pro_info[item]['price']}      {pro_info[item]['store']}")
        else:
            print("商品id不存在")
        pid = input("请输入要删除的商品id:")
    elif option == 4:
        print("欢迎下次再来~")
        break

4. 分析用户好友关系数据

  1. 以下是你的好友, 构建你与Bob的共同好友集合,计算共同好友数量
  2. 推荐可能认识的好友(好友的好友)
friends = {
    "Alice": {"Bob", "Charlie", "Cali"},
    "Bob": {"Alice", "David", "Cali"},
    "Charlie": {"Alice", "David"}
}
friend = []
for key in friends:
    friend.append(key)
    my_friends = set(friend)
print(my_friends & friends["Bob"])		# {'Alice'}
may_friends = []
for value in friends.values():
    may_friends.extend(value)	
print(set(may_friends))		# {'Cali', 'David'}

5. 分解数字的质因数

如84 => 2,2,3,7

num = input("请输入数字:")
i = 2
prime_factor = []
while num // i >= 1:
    if num % i == 0:
        prime_factor.append(i)
        num = num // i
    else:
        i += 1
print(f"质因数为:{prime_factor}")

6. 二分查找

有一个列表[1,3,5,7,9],输出一个数,用二分查找实现查找该数

list = [1, 3, 5, 7, 9]
left = 0
right = len(list) - 1
num = input("请输入数字:")
while left <= right:
    mid = (left + right) // 2
    if num < list[mid]:
        right = mid + 1
    elif num > list[mid]:
        left = mid + 1
    elif num == list[mid]:
        print(f"该数在列表{list}的位置为:{mid}")
        break
else:
    print(f"未找到该数")

7. 冒泡排序

对列表[3, 1, 4, 2]实现冒泡排序

通过重复遍历待排序序列,比较相邻元素并交换位置,使较大的元素逐渐 “浮” 到序列末尾

list = [3, 1, 4, 2]
n = len(list)
for i in range(n-1):
    for j in range(n -1 -i):
        if list[j] > list[j+1]:
            list[j], list[j+1] = list[j+1], list[j]
print(f"冒泡排序后的列表为:{list}")	# 冒泡排序后的列表为:[1, 2, 3, 4]

8. 根据测试结果(json)文件,生成测试通过率,及最耗时的用例,并按耗时将测试用例进行排序(top10)

序号 用例名 耗时
1 登录测试 4.2s
2 支付测试 3.3s

with open("test_result.json","r",encoding="utf-8") as f:
    content = f.read()
    # 将 JSON 字符串解析为 Python 数据结构
    data = json.loads(content)
    # 初始的通过数,测试的结果数为0
    pass_number = 0
    test_result_number = 0
    # 初始耗时和用例为空
    times = []
    cases = []
# 计算测试通过率,及最耗时用例
for item in data:
	# 取出测试的结果,时间和用例
    test_result = item["result"]
    test_time = item["time"]
    test_case = item["case"]    
    test_result_number += 1
    # 将耗时和用例存储到times和cases
    times.append(test_time)
    cases.append(test_case)
    # 统计测试通过的个数
    if test_result == "pass":
        pass_number += 1
# 测试通过率
pass_rate = pass_number / test_result_number
# 将耗时和用例排序
for i in range(test_result_number - 1):
    for j in range(test_result_number - 1 - i):
        if times[j] < times[j + 1]:
            times[j], times[j + 1] = times[j + 1], times[j]
            cases[j], cases[j + 1] = cases[j + 1], cases[j]
print(f"测试通过率:{pass_rate}")
print(f"最耗时用例:{cases[0]},耗时{times[0]}s")
print("\n耗时测试top10")
print("序号  用例名  耗时")
for k in range(10):
    print(f"{k + 1} {cases[k]} {times[k]}s")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值