ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python教学系列09:字典和集合——高级“箱子“

Python教学系列09:字典和集合——高级“箱子“

作为副业或者职业发展的价值提示, 字典和集合在处理数据方面是非常得力的工具。字典采用键值对的方式存储信息, 使得查询速度非常快。

集合则具备自动去重的功能, 这是处理重复数据的必备选择。只要学会使用这两个概念, 你的数据处理能力就会得到直接的提升, 这样在进行客户管理和数据统计工作时, 就不会感到头疼了。

一、所谓的字典是什么呢? 它就是一个带有名字的“箱子”。

在前边所学的列表里, 咱们是靠编号来存取数据的。

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:什么时候用集合?

七、总结与下集预告

今天你学到了:

下集预告: 在下一节课当中, 我们会去进行学习有关“代码封装术”这样一个话题,这个内容指的就是函数这个东西。如果你学会了怎么写函数, 那么你就能够避免去重复地写那些代码了。你只需要把这部分的代码写上一回, 后续就可以让它被使用一百回, 这样就能让你的那一段代码既短小又显得非常专业!

这里有一个来自老顽童的温馨提示需要给大家说清楚, 那就是字典是那种在里头使用频率特别非常高的数据结构之一, 所以对于它来说, 大家一定是需要把它给熟练掌握住的。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进