作为副业或者职业发展的价值提示, 字典和集合在处理数据方面是非常得力的工具。字典采用键值对的方式存储信息, 使得查询速度非常快。
集合则具备自动去重的功能, 这是处理重复数据的必备选择。只要学会使用这两个概念, 你的数据处理能力就会得到直接的提升, 这样在进行客户管理和数据统计工作时, 就不会感到头疼了。
一、所谓的字典是什么呢? 它就是一个带有名字的“箱子”。
在前边所学的列表里, 咱们是靠编号来存取数据的。
customers = ["张三", "李四", "王五"]print(customers[0]) # 用编号0找到"张三"
可是有时我们的确不愿去记住那些编号, 希望直接使用“名字”来进行存取操作的, 于是我们在此时此地就选择了使用字典这一数据结构。
2. 你要去把那个字典给创建起来。
# 字典用花括号,键值对用冒号分隔person = {
"姓名": "张建国",
"年龄": 55,
"城市": "北京",
"职业": "退休工程师"
}
print(person)
3. 访问字典数据
person = {"姓名": "张建国",
"年龄": 55,
"城市": "北京",
"职业": "退休工程师"
}
# 用键来访问值
print(person["姓名"]) # 张建国
print(person["年龄"]) # 55
# 用get方法(更安全,键不存在也不报错)
print(person.get("电话", "暂无")) # 键不存在,返回默认值"暂无"
4. 对字典里的数据来进行修改, 再把新的数据添加进去。
person = {"姓名": "张建国", "年龄": 55}# 修改已有键的值
person["年龄"] = 56
print(person["年龄"]) # 56
# 添加新键值对
person["电话"] = "13812345678"
person["城市"] = "上海"
print(person)
# {'姓名': '张建国', '年龄': 56, '电话': '13812345678', '城市': '上海'}
# 删除键值对
removed = person.pop("城市")
print(f"删除了:{removed}")
print(person)
# {'姓名': '张建国', '年龄': 56, '电话': '13812345678'}
5. 字典的遍历
person = {"姓名": "张建国",
"年龄": 55,
"城市": "北京"
}
# 遍历所有键
for key in person:
print(f"{key}:{person[key]}")
# 遍历所有键值对
for key, value in person.items():
print(f"{key}:{value}")
# 遍历所有键(另一种方式)
for key in person.keys():
print(key)
# 遍历所有值
for value in person.values():
print(value)
二、集合是一种能够对数据进行去重操作的, 非常厉害的工具。那么, 集合到底是什么东西呢?
集合在人们的认知里面, 可以被比喻为一个“去重盒子”, 因为它具有一种自动去掉重复元素的功能。
# 创建集合fruits = {"苹果", "香蕉", "橙子", "苹果", "香蕉"}
print(fruits) # {'苹果', '香蕉', '橙子'} 自动去重了!
2. 集合的基本操作
# 添加元素s = {1, 2, 3}
s.add(4)
print(s) # {1, 2, 3, 4}
# 删除元素
s.remove(2) # 删除指定元素
print(s) # {1, 3, 4}
# 集合运算:交集、并集、差集
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b) # 交集:{3, 4}
print(a | b) # 并集:{1, 2, 3, 4, 5, 6}
print(a - b) # 差集:{1, 2}
print(a ^ b) # 对称差集:{1, 2, 5, 6}
3. 进行快速的去重处理。
# 列表去重最简单的方法:转成集合再转回列表numbers = [1, 2, 3, 2, 1, 4, 5, 4, 3, 2]
unique = list(set(numbers))
print(unique) # [1, 2, 3, 4, 5]
有一点需要特别注意一下, 集合本身是无序的这样一个结构, 所以在把它重新转换回列表的时候, 那个顺序说不定就已经发生变化了。
三、实战练习:投票统计系统
我们来制作一个具备实际使用价值的, 也就是投票统计程序。
# ========== 投票统计系统 ==========print("=" * 50)
print(" 投票统计系统")
print("=" * 50)
# 模拟投票数据(实际可用input让用户输入)
votes = ["张三", "李四", "王五", "张三", "李四",
"李四", "张三", "赵六", "李四", "王五"]
print(f"投票总数:{len(votes)}票")
# 用字典统计每个人的得票数
vote_count = {}
for name in votes:
if name in vote_count:
vote_count[name] += 1
else:
vote_count[name] = 1
# 或者用简洁写法(get方法)
# for name in votes:
# vote_count[name] = vote_count.get(name, 0) + 1
# 打印统计结果
print("\n【投票结果】")
print("-" * 30)
for name, count in vote_count.items():
bar = "█" * count # 用方块画进度条
print(f"{name:8s} {count:2d}票 {bar}")
# 找出最高票
winner = max(vote_count, key=vote_count.get)
max_votes = vote_count[winner]
print("-" * 30)
print(f"\n 本次投票胜出:{winner}({max_votes}票)")
# 用集合统计投票人数(去重)
unique_voters = set(votes)
print(f"\n实际投票人数:{len(unique_voters)}人")
# 参与投票的候选人也用集合
candidates = {"张三", "李四", "王五", "赵六"}
all_people = candidates | unique_voters
print(f"涉及人员总数:{len(all_people)}人")
运行效果:
==================================================投票统计系统
==================================================
投票总数:10票
【投票结果】
------------------------------
张三 3票 ███
李四 4票 ████
王五 2票 ██
赵六 1票 █
------------------------------
本次投票胜出:李四(4票)
实际投票人数:4人
涉及人员总数:4人
四、这是用来做实战练习的, 涉及到了一个名叫员工信息管理系统的东西。
用字典存储员工信息:
# ========== 员工信息管理系统(字典版)==========print("=" * 55)
print(" 员工信息管理系统")
print("=" * 55)
# 员工数据库(用字典存储每个员工的信息)
employees = {
"E001": {
"姓名": "张建国",
"部门": "市场营销",
"月薪": 12000,
"入职年份": 2015
},
"E002": {
"姓名": "李秀英",
"部门": "财务部",
"月薪": 10000,
"入职年份": 2018
},
"E003": {
"姓名": "王大海",
"部门": "技术部",
"月薪": 15000,
"入职年份": 2012
}
}
# 显示所有员工信息
def show_all_employees():
print("\n【员工列表】")
print("-" * 55)
print(f"{'工号':<8}{'姓名':<10}{'部门':<12}{'月薪':<10}{'入职年份'}")
print("-" * 55)
for emp_id, info in employees.items():
print(f"{emp_id:<8}{info['姓名']:<10}{info['部门']:<12}"
f"{info['月薪']:<10}{info['入职年份']}")
print("-" * 55)
print(f"共 {len(employees)} 名员工")
# 查询员工
def search_employee():
emp_id = input("请输入要查询的工号(如E001):")
if emp_id in employees:
info = employees[emp_id]
print(f"\n【员工信息】")
print(f" 工号:{emp_id}")
print(f" 姓名:{info['姓名']}")
print(f" 部门:{info['部门']}")
print(f" 月薪:{info['月薪']}元")
print(f" 入职年份:{info['入职年份']}年")
# 计算工龄
years = 2026 - info['入职年份']
print(f" 工龄:约{years}年")
else:
print(" 未找到该员工!
")
# 主程序
while True:
print("\n1. 查看所有员工")
print("2. 查询员工信息")
print("3. 添加员工")
print("4. 退出系统")
choice = input("\n请选择(1-4):")
if choice == "1":
show_all_employees()
elif choice == "2":
search_employee()
elif choice == "3":
emp_id = input("请输入新员工工号:")
name = input("请输入姓名:")
dept = input("请输入部门:")
salary = float(input("请输入月薪:"))
year = int(input("请输入入职年份:"))
employees[emp_id] = {
"姓名": name,
"部门": dept,
"月薪": salary,
"入职年份": year
}
print(" 添加成功!
")
elif choice == "4":
print("\n感谢使用!
再见!
")
break
五、请你亲自动手试着做一下。
练习1:通讯录程序
使用字典这个结构, 来搭建一个通讯录系统。
关于成绩单的统计这一项内容的练习, 编号为2。
使用字典这种工具, 来统计一组成绩数据里面, 属于每一种分数段的具体人数都有多少。
关于这个练习三, 大家要进行去重这样一个操作。
emails = ["a@163.com", "b@qq.com", "c@163.com", "d@gmail.com", "b@qq.com"]通过使用集合这个数据类型的方法来剔除那些重复存在的邮箱地址, 然后将最终得到的不再含有重复项的结果给打印出来。
六、常见问题解答
Q1:字典和列表有什么区别?
问题二是这个字典里面的那些个键, 是有什么样的限制条件存在的吗。
关于第三个问题, 我们来了解一下集合里面具体存在哪些规则限制。
Q4:什么时候用集合?
七、总结与下集预告
今天你学到了:
下集预告: 在下一节课当中, 我们会去进行学习有关“代码封装术”这样一个话题,这个内容指的就是函数这个东西。如果你学会了怎么写函数, 那么你就能够避免去重复地写那些代码了。你只需要把这部分的代码写上一回, 后续就可以让它被使用一百回, 这样就能让你的那一段代码既短小又显得非常专业!
这里有一个来自老顽童的温馨提示需要给大家说清楚, 那就是字典是那种在里头使用频率特别非常高的数据结构之一, 所以对于它来说, 大家一定是需要把它给熟练掌握住的。