python3-列表、元组、字典和集合
概述
内容概述:本章节主要是完成列表、元组、字典和集合的基本操作、并在各个章节穿插了部分的小练习,希望对大家有帮助。
提示:以下是本篇文章正文内容,下面案例仅供参考,欢迎指正
一、列表
1.定义
# 列表定义
"""
空列表 []
有内容列表 ['A' ,'B', 'C'],[1,2,3,4,5,6],[[],[],[]]
数据类型:
int 1 2 3 4 5 6
float 1.9 2.8 ...
str: ''
bool: True False
list
"""
lst = ['牛奶', '面包', '火腿肠', '臭豆腐']
print(lst[1]) # 索引或者下标获取
print(lst[2])
# 切片 [start:end:step]
print(lst[:2])
print(lst[2:4])
print(lst[::-3]) # ['臭豆腐', '牛奶'] 步长-3
2.函数:排序反转
# 排序和反转
import random
"""
sort:排序
默认升序
sort(reverse=True) : 降序
reverse:单纯反转,没有排序
"""
# 生成1-20 8个随机正数保存到列表
lst = []
for i in range(8):
lst.append(random.randint(1, 20))
print(lst)
lst.sort() # 默认升序
print(lst)
lst.sort(reverse=True) # 降序升序
print(lst)
lst.reverse()
print(lst)
print('测试:生成数字倒叙排列'.center(50, '-'))
'''
生成8 个1-100 之间的随机正数,保存到列表中
键盘输入一个1-100之间的正数,将正数插入到排序后的列表中,升序或者降序都行
'''
# 生成1-100 8个随机正数保存到列表
lst = []
for i in range(8):
lst.append(random.randint(1, 100))
num = int(input("键盘输入一个1-100之间的正数:"))
lst.sort(reverse=True)
print(lst)
lst.append(num)
lst.sort(reverse=True)
print(lst)
print('测试:交换两个变量的值'.center(50, '-'))
a = 3
b = 5
print(a, b)
contain = a
a = b
b = contain
print(a, b)
# python 写法
a, b = b, a
print(a, b)
a, b, c = b, a, b # 交叉赋值
print(a, b, c)
3.基本操作:增、删、改、查
# list 的基本增删改查
import random
"""
增:
+ 、append 、extend
删:
remove:
# 报错:x not in list
# 结合 if 'x' in shelves: # 判断是否存在
元素 in 列表: 表示元素在列表中? 返回值 bool
如果列表中存在多个同名的元素,只删除遇到的第一个元素
pop:
pop(index):根据下标删除表中元素,下表在写的时候注意不要超出范围:index out of range
pop():从后向前依次删除
clear :lst.clear(),清空后还可以添加元素
del : del lst() 删除整个列表,删除后添加元素报错:’lst‘ is not defined 内存被释放了
改:
insert(index,value):index 位置 value 元素;插队其他元素后移
lst[1]=2 直接定位赋值
lst.index(元素):定位元素位置
查:
1. 元素 in 列表 返回值bool类型
2. 元素 not in 列表 返回值bool类型
3. 列表.index(元素) 返回元素的下标位置,如果没有此元素则报错
4. 列表.count(元素) 存在返回个数,不存在范围0
"""
print('添加操作'.center(30, '-'))
lst1 = []
lst2 = ['面包']
lst1.append('面条')
lst1.append('火腿')
lst1.append('方便面')
print(lst1)
lst2.append('薯条')
print(lst2)
'''
数字:n = 1+3
字符串:s = 'aa' + 'bb' --->aabb
列表:
list = [1,2,3,4] + [a,d,f] --->[1,2,3,4,a,d,f]
list合并:
+ 和 extend
'''
lst1 += lst2
print(lst1)
lst1.extend(lst2)
print(lst1)
'''
买多件商品:
商品名称、价格、数量
计算商品总数和总价格
'''
shelves = ['面条', '火腿', '方便面', '辣条', '鸡腿', '火腿长'] # 货架
cart = [] # 购物车
sm_price = 0.0 # 商品总价
sm = 0 # 商品总数量
while True:
product = []
name = shelves[random.randint(0, 5)]
price = round(random.random() * 100, 2)
count = random.randint(1, 10) # 限制最多10件
product.append(name)
product.append(price)
product.append(count)
cart.append(product)
sm_price += price * count
sm += count
flag = input('是否退出?(按q/Q退出)')
if flag.lower() == 'q':
break
print("购物车:", cart)
print("商品总数", sm)
print("总价格", sm_price)
# 遍历购物清单
print('名称\t\t价格\t\t数量')
for product in cart:
print(product[0], product[1], product[2], sep="\t\t")
print('删除操作'.center(30, '-'))
print(shelves)
# shelves.pop(9) # 添加下标,pop index out of range
shelves.pop() # 根据下标从左道右删除
print(shelves)
# shelves.remove('x') # 报错:x not in list
# 判断是否存在元素
if 'x' in shelves: # 判断是否存在
shelves.remove('x')
shelves.remove('方便面')
print(shelves) # 根据元素名称删除
print('删除多个元素'.center(30, '-'))
# 删除多个相同元素
goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 会造成漏删:因为下标错乱导致
for good in goods:
if good == '面条':
goods.remove(good)
print(goods)
# 解决漏删问题:方案一
while goods.__contains__('面条'):
for good in goods:
if good == '面条':
goods.remove(good)
print(goods)
goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题:方案二:(拷贝了一份数据)和正反无关
for good in goods[::-1]:
if good == '面条':
goods.remove(good)
print(goods)
new_goods = ['面条', '火腿', '方便面', '面条', '面条', '辣条', '鸡腿', '面条', '火腿长', '面条']
# 解决漏删问题:方案二 (拷贝了一份数据)
for good in new_goods[::]:
if good == '面条':
new_goods.remove(good)
print(new_goods)
del new_goods[3] # 删除元素 和 new_goods.pop(3) 类似
print(new_goods)
print('修改元素'.center(50, '-'))
lst = [1, 2, 4, 5, 6, 8]
lst.insert(2, 3)
print(lst)
lst[0] = 0
print(lst)
lst[lst.index(8)] = 9 # index(元素) 获取元素位置,定位
print(lst)
print(lst.clear())
print('查找元素'.center(50, '-'))
lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
print(lst.count(8))
print(lst.count(9))
print('内存地址诠释'.center(50, '-'))
lst = [1, 2, 4, 5, 6, 8, 8, 8, 8]
lst2 = lst
# lst.clear()
del lst2 # 删除指针指向
print(lst)
# print(lst2)
print(id(lst))
# print(id(lst2))
4.列表推导式
# 列表推导式
"""
列表推导式:最终得到的是一个列表:
格式:
lst = [i for i in range(100)]
lst = [i for i in range(100) if 条件]
lst = [i if 条件1 else 条件2 for i in range(100) ]
"""
# 传统
lst = []
for i in range(20):
lst.append(i)
print(lst)
# 列表推导式
lst = [i for i in range(20)]
print(lst)
lst = [i + 2 for i in range(20)] # 格式一
print(lst)
lst = [i for i in range(0, 101, 2)] # 格式一
print(lst)
lst = [i for i in range(101) if i % 2 == 0] # 格式二:带判断条件
print(lst)
lst2 = ['62', 'hello', '100', 'world', 'luck', '88']
lst = [word for word in lst2 if word.isalpha()] # 全部是字母组成的新单词
print(lst)
# 如果是h开头的首字母大写,如果不是h开头的则全部转成大写 if else
lst = [word.title() if (word.isalpha() and word.startswith('h'))
else word.upper()
for word in lst2]
print(lst)
# 2层for 循环
lst3 = [(i, j) for i in range(5) for j in range(5)] # 2层for循环
print(lst3)
# 实现将1-100 中的数字3个一组如[[1,2,3],[4,5,6]...]
lst = [[i, i + 1, i + 2] if i < 100 else [i] for i in range(1, 101, 3)]
print(lst)
nei_lst = [i for i in range(1, 101)]
lst = [nei_lst[i:i + 3] for i in range(0, len(nei_lst), 3)]
print(lst)
5. 练习
# 练习
import random
import time
print(round(random.random() * 100, 2)) # 保留两位小数
print('练习:冒泡排序'.center(50, '-'))
# 生成1-100 8个随机正数保存到列表
lst = []
for i in range(8):
lst.append(random.randint(1, 100))
for j in range(len(lst) - 1): # 轮数
for i in range(len(lst) - 1 - j): # 两两比较
if lst[i] > lst[i + 1]:
lst[i], lst[i + 1] = lst[i + 1], lst[i] # 交换变量 升序
print(lst)
print('练习:王者荣耀'.center(50, '-'))
'''
王者荣耀角色管理:
角色:姓名 性别 职业
添加角色
删除角色
修改角色
查询角色
查询所有角色
退出系统
'''
print('欢迎进入王者荣耀角色管理'.center(30, '~'))
roles = []
flg = True
while flg:
print('''
当前系统有如下功能
1. 添加角色
2. 删除角色
3. 修改角色
4. 查询角色
5. 查询所有角色
6. 退出系统
''')
choose = input("请选择:")
if choose == '1':
while True:
name = input("输入角色名称:")
key = input("输入角色key:")
for role in roles: # 判断角色是否存在
if role.__contains__(key):
print("请重新输入:该角色key存在")
continue
role = [name, key]
roles.append(role)
flag = input("是否退出(q/Q):")
if flag.lower() == 'q':
break
# 查询
print("查询角色:", roles)
elif choose == '2':
key = input("输入需要删除的角色key:")
for role in roles:
if role.__contains__(key):
roles.remove(role)
elif choose == '3':
key = input("输入需要修改的角色key:")
new_name = input("输入新的角色名称:")
new_key = input("输入新的角色key:")
for role in roles:
if role.__contains__(key):
role.clear()
role.append(new_name)
role.append(new_key)
print("修改后的角色列表:", roles)
elif choose == '4':
key = input("输入需要查询的角色key:")
for role in roles:
if role.__contains__(key): # 或者:key in role
print("角色key对应的角色信息:", role)
elif choose == '5':
print("所有角色:", roles)
elif choose == '6':
print("正在退出系统...")
time.sleep(3) # 休眠三秒
print("退出系统成功,欢迎下次再来!")
flg = False
else:
print("输入有误请重新输入!")
二、元组
1.基本操作
代码如下(示例):
# 元组操作
"""
python 中元组只能存,不能修改(修改、删除、增)
元组 小括号(),列表:方括号[];
tuple:元组
当一个元素的时候,必须加一个, 如 ('123',)
注意:没有逗号,就不是元组
count() 计数
list:列表
list 和tuple互转:
list(tup): 元组转列表
tuple(lst):列表转元组
"""
tup = ("123", 123, 'aaa', 'bbb')
print(tup)
print(type(tup)) # <class 'tuple'>
tup = ("123") # <class 'str'>
print(type(tup))
tup = ("123",) # <class 'tuple'>
print(type(tup))
# 下标和切片同样适用---->字符串、列表、元组注意下标越界
tup = ("123", 123, 'aaa', 'bbb', 123)
print(tup[1])
print(tup[:2])
print(tup[::2])
# 添加元素 count() 计数
print(tup.count(123))
print(tup.index('123'))
print(tup.index('bbb', 1)) # 开始、结束位置
print(len(tup))
for i in tup:
print(i)
# 元组转列表
lst = list(tup) # 元组转列表
print(lst)
lst.append('guess')
tup = tuple(lst) # 元组转列表
print(tup)
三、字典
1. 增删改查基本操作
# 字典操作
"""
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示:
修改:
存在key 修改
添加:
不存在key 添加
删除:
pop:根据key删除
popitem() :默认是从后往前删除,返回元组(key,value);没有元素会抛出异常
del book[key]
查询:
列表:list.index list.count in
book.get(key) 、get(key,'默认值'):根据key获取value值,没有返回None或者默认值
dict[key] 根据key获取value值: 没有返回key 报error错误
keys():获取key
for k in book.keys():
print(k)
values():获取值
for v in book.values():
print(v)
items() :获取键值对
for k,v in book.items():
print(k,v)
"""
dict1 = {'name': '李四', 'age': 18, 'sex': '男'}
print(type(dict1))
print(dict1)
# 如果存在key则修改
dict1['name'] = '张三'
dict1['age'] = 20
dict1['sex'] = '男'
print(dict1)
# 如果不存在key则添加
dict1['score'] = 90
print(dict1)
'''
书库:
book = {}
书名、价格、作者、出版社
促销:价格折扣:8折
打印最终字典中的值
'''
library = [] # 图书馆
book = {}
while True:
print("添加书本:")
name = input("书名:")
price = float(input("价格:"))
author = input("作者:")
publishing_house = input("出版社:")
book = {"书名": name, "价格": price, "作者": author, "出版社": publishing_house}
library.append(book)
flag = input("是否退出(q/Q):")
if flag.lower() == 'q':
break
print("促销打折".center(30, '*'))
# 修改
for book in library:
if book.get('书名') == '西游记':
book['价格'] *= 0.8 # 如果是西游记打8折出售
print(library)
# 遍历和查询
print("遍历和查询".center(30, '*'))
for book in library:
if book.get('书名') == '西游记': # 获取
print(book)
for k, v in book.items():
print([k, v])
print(len(book))
print(book.items()) # 获取字典中所有的键值对
print(book.keys()) # 获取字典中所有的key
print(book.values()) # 获取字典中所有的值
print(list(book.values())) # 获取字典中所有的值
# 删除字段
print("删除字段".center(30, '*'))
for book in library:
if book.get('书名') == '红楼梦':
book.pop("书名")
print(library)
print("函数补充".center(30, '*'))
# 增加
book.setdefault('discount', 0.8) # 只能做添加k-v使用
print(book)
dict1 = {'test': '测试'}
book.update(dict1) # 字典合并,不能使用+号
print(book)
book.fromkeys(book) # 返回新的字典
book.fromkeys(['a', 'b']) # 用给的列表,创建返回一个新的字典
print(book.fromkeys(book))
m1, m2 = input("请输入用户名 密码:").split(' ')
print(m1, m2)
# 字典转换其他 :可以转换,只是将字典的键放到列表、元组、集合中
print("字典转换".center(30, '*'))
schools = {"name": "张三", "age": 18}
result = list(schools)
print(result)
result = set(schools)
print(result)
result = tuple(schools)
print(result)
# 其他转换字典
lst = [("name", "张三"), ("age", 18)] # 只有这种可以转
dic2 = dict(lst)
print(dic2)
四、集合
1. 基本操作
# set 集合
import random
"""
set :
特点:无序的,所以无下标
符号:{} {元素、元素、元素}----->集合
{} {k:v,kk:v}---------> 字典
定义空set:
st = set() # 定义空set
st = {} # 表示字典
增加:
add
update( x ) :也可以添加元素,且参数可以是列表,元组,字典等。
删除:
remove: 有元素删除、如果没有报错:keyError
discard:有就删除,没有就不删除
del: 删除集合
clear:清空集合
交集、并集、差集:
difference 或者 -: 差集
intersection 或者 &:交集
union 或者 |: 并集
"""
st = {'zhangsan'}
print(type(st))
lst = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3]
print(lst)
print(set(lst)) # 去重
st = set() # 定义空set
print(type(st))
# set 增加
st.add('张三')
st.add('李四')
st.add('王五')
print(st)
st1 = {'赵六'} # 集合合并
st.update(st1)
print(st) # 每一次的顺序无需,
# set 删除
st.remove('张三')
print(st)
print('生成字母数字的验证码'.center(40, '#'))
'''
练习:
产生 5组不允许重复,字母和数字组合4位验证码
s = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM123456789'
也可以采用函数:random.choice(s) 或者 random.random(0,len(s)-1)
'''
code_set = set()
while len(code_set) < 5:
strs = ''
while len(strs) < 4:
num = random.randint(0, 127)
if ord('a') <= num <= ord('z') or ord('A') <= num <= ord('Z'):
strs += chr(num)
elif 0 <= num <= 9:
strs += str(num)
code_set.add(strs)
print("5组4位随机验证码:{}".format(code_set))
# 补充删除
# del code_set # 删除集合
# code_set.clear() # 清空
code_set.pop() # 随机删除
# 交集、并集、差集
set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {6, 7, 8, 9, 0}
print(set1.intersection(set2)) # 交集
print(set1.union(set2)) # 并集
print(set1.difference(set2)) # 差集:有顺序
print(set2.difference(set1)) # 差集
# | & -
print(set1 & set2) # 交集
print(set1 | set2) # 并集
print(set1 - set2) # 差集
2. ord 和chr
# ord 获取 字母的Unicode值
print(ord('a'))
print(ord('z'))
print(ord('A'))
print(ord('Z'))
print(chr(97))
五、公共方法
1. 元组、列表、字典和集合对比(图书管理系统)
"""
类型
list: 允许元素重复、有序有下标 []
tuple: 允许重复,里面的元素不能增加删除修改、只能查看 ()
dict: 键值对出现,键是唯一的,值允许重复{}
set: 不允许重复,无序 {}
类型转换:
tuple ---> list
list ---> tuple,set(长度可能变化)
set ---> tuple,list
dict ---> list、set、tuple 可以转换、但是只是将字典的键放到[],{},()
list---> dict:
可以转换,单格式要求必须是:lst = [("name", "张三"), ("age", 18)];lst = [["name", "张三"], ["age", 18]]
"""
'''
练习:
图书管理系统
library :
字典存取:library = {"书名": name, "价格": price, "作者": author,"库存":in_stock}
功能:
1. 借书
2. 还书
3. 查询
4. 查询所有
5. 退出
'''
library = [
{"name": "西游记", "price": 100, "author": '吴承恩', "in_stock": 3},
{"name": "红楼梦", "price": 300, "author": '曹雪芹', "in_stock": 2},
{"name": "三国演义", "price": 200, "author": '罗贯中', "in_stock": 2},
{"name": "水浒传", "price": 80, "author": '施耐庵', "in_stock": 1}
]
while True:
print('''
欢迎进入图书管理系统
1. 借书
2. 还书
3. 查询
4. 查询所有
5. 退出
''')
choose = input("请选择进入:")
if choose == '1':
while True:
print("欢迎进入借书管理".center(10, '*'))
book_name = input("请输入借阅的书籍名称:")
bk = {}
for book in library:
if book.get('name') == book_name:
bk = book
stock_num = book.get("in_stock")
if stock_num > 0:
while True:
print("书籍详情:", book)
is_borrow = input("是否借阅(1:是,2:否):")
if is_borrow == '2':
print("退出借阅")
break
elif is_borrow == '1':
borrow_num = int(input("请输入借阅数量:"))
stock_num = book.get("in_stock")
if stock_num >= borrow_num > 0:
book['in_stock'] = stock_num - borrow_num
flg = input("是否退出(Q/q)")
if flg.lower() == 'q':
break
elif stock_num < borrow_num:
print("借阅数量超过库存,请重新选择!")
else:
print("输入有误请检查!")
else:
print("该藏书已被全部借阅,请重新选择或者改天再来!")
if len(bk) == 0:
print("图书馆没有该藏书,请重新输入!")
flg = input("是否退出借阅(Q/q)")
if flg.lower() == 'q':
break
elif choose == '2':
while True:
print("欢迎进入还书管理".center(10, '*'))
book_name = input("请输入要还的书籍名称:")
bk = {}
for book in library:
if book.get('name') == book_name:
bk = book
stock_num = book.get("in_stock")
print("书籍详情:", book)
while True:
is_return = input("是否还书(1:是,2:否):")
if is_return == '2':
print("退出还书")
break
elif is_return == '1':
return_num = int(input("请输入归还数量:"))
if return_num > 0:
book['in_stock'] = stock_num + return_num
print("当前书籍库存情况:", book)
flg = input("是否退出(Q/q)")
if flg.lower() == 'q':
break
else:
print("输入有误请检查!")
else:
print("输入有误请检查!")
if len(bk) == 0:
print("图书馆没有该藏书,请检查输入!")
flg = input("是否退出归还(Q/q)")
if flg.lower() == 'q':
break
elif choose == '3':
while True:
print("欢迎进入查询管理".center(10, '*'))
book_name = input("请输入要查询书籍名称:")
bk = {}
for book in library:
if book.get('name') == book_name:
bk = book
print("书籍详情:", book)
if len(bk) == 0:
print("图书馆没有该藏书,请重新输入!")
flg = input("是否退出查询(Q/q)")
if flg.lower() == 'q':
break
elif choose == '4':
while True:
print("欢迎进入查询所有管理".center(10, '*'))
print("{}{}{}{}".format("书名".center(10), "价格".center(10), "作者".center(10), "库存".center(10)))
for book in library:
print("{}{}{}{}".format(book.get('name').center(10), str(book.get('price')).center(10),
book.get('author').center(10), str(book.get('in_stock')).center(10)))
flg = input("是否退出查询所有(Q/q)")
if flg.lower() == 'q':
break
elif choose == '5':
flag = input("是否退出图书管理系统(q/Q):")
if flag.lower() == 'q':
break
else:
print("输入有误请重新输入!")
2. 公共方法
# 公共方法
"""
print()
id()
input()
type()
id()
len()
oct()
hex()
chr()
ord()
"""
lst = [1, 3, 5, 73, 7, 80, 53, 6, 8, 32, 79, 33]
print(max(lst)) # 最大值
print(min(lst)) # 最小值
print(sum(lst)) # 求和
print(abs(-1)) # 绝对值
tup = (1, 9, 8, 4, 5, 6)
result = sorted(tup, reverse=True) # 倒叙
print(result)
result = sorted(tup)
print(result)
result = chr(96) # AscII 码
print(result)
result = chr(65)
print(result)
result = ord('a') # AscII 码
print(result)
result = ord('z')
print(result)
result = ord('A')
print(result)
result = ord('Z')
print(result)
# 符号 + - * & |
# + (合并): 支持字符串、列表、元组
result = 'hello' + 'world'
print(result)
result = [1, 2, 3, 4] + [5, 6, 7]
print(result)
result = (1, 2, 3, 4) + (1, 2, 3, 4)
print(result)
# * (复制): 支持字符串、列表、元组
result = [1, 2] * 4
print(result)
# - & | 只能交集、并集、差集
# in /not in : 元素是否存在,字符串、列表、元组、字典(判断key是否存在)
总结
文章总结如下:
以上就是本文要讲的内容,本文仅仅简单介绍了集合、元组、列表和字典的基本使用,大家可以酌情参考学习。