当前位置:首页 > 技术 > 正文内容

Python内置数据结构详解:字典、集合与推导式应用

访客 技术 2026年6月15日 1

字典:灵活的键值映射

字典是Python中一种可变容器,用于存储键值对。它基于哈希表实现,支持快速查找、插入和删除操作。使用花括号 {} 或 dict() 构造函数可以创建空字典。

基本操作

# 创建一个空字典
data = {}

# 添加键值对
data['Alice'] = 'Engineer'
data['Bob'] = 'Designer'
data[42] = 'Answer'

# 访问值
print(data['Alice'])  # 输出: Engineer

# 检查键是否存在
if 'Bob' in data:
    print("Found Bob")

# 删除键值对并获取其值
role = data.pop('Bob')  # role = 'Designer'

# 获取所有键和值
keys = list(data.keys())    # ['Alice', 42]
values = list(data.values())  # ['Engineer', 'Answer']

# 批量更新或合并字典
updates = {'Charlie': 'Manager', 'Alice': 'Senior Engineer'}
data.update(updates)

从序列构建字典

通过 zip 函数将两个列表组合成键值对,并转换为字典:

names = ['Tom', 'Jerry', 'Spike']
roles = ['Cat', 'Mouse', 'Dog']

# 方法一:循环赋值
personnel = {}
for name, role in zip(names, roles):
    personnel[name] = role

# 方法二:直接构造
personnel = dict(zip(names, roles))

键的不可变性要求

字典的键必须是可哈希类型,即不可变对象。常见合法键包括字符串、数字和只包含不可变元素的元组。

# 合法键示例
valid_key_dict = {(1, 2): "tuple key", 3.14: "pi", "name": "value"}

# 非法键会引发错误
try:
    invalid = {[1, 2]: "list key"}  # 抛出 TypeError
except TypeError as e:
    print("无法使用列表作为键:", e)

# 检查是否可哈希
print(hash((1, 2)))   # 成功返回哈希值
print(hash(frozenset([1,2])))  # frozenset 是可哈希的集合

集合:唯一元素的无序集

集合(set)是一种不重复且无序的数据结构,适合去重和数学集合运算。

# 创建集合
group_a = set([1, 2, 3, 4])
group_b = {3, 4, 5, 6}  # 使用花括号

# 并集
union_set = group_a | group_b  # 或 group_a.union(group_b)
# 结果: {1, 2, 3, 4, 5, 6}

# 交集
common = group_a & group_b  # 或 group_a.intersection(group_b)
# 结果: {3, 4}

# 差集
diff = group_a - group_b  # 在 A 中但不在 B 中
# 结果: {1, 2}

# 移除元素
group_a.discard(1)  # 安全移除(不存在也不报错)
group_a.remove(2)   # 移除指定元素(若不存在则抛异常)

# 判断子集关系
subset_check = {3,4}.issubset(group_b)  # True
superset_check = group_a.issuperset({3})  # False

注意:集合中的元素也必须是可哈希类型,因此不能包含列表或字典。

推导式:简洁生成容器

推导式提供了一种优雅的方式,在一行代码内生成新的列表、集合或字典。

列表推导式

语法:[expression for item in iterable if condition]

words = ['hello', 'world', 'python', 'ai']

# 提取长度小于6的单词的大写形式
short_caps = [w.upper() for w in words if len(w) < 6]
# 结果: ['HELLO', 'WORLD']

集合推导式

用于生成不含重复项的结果集。

# 获取每个单词的首字母
first_letters = {word[0].lower() for word in words}
# 结果: {'h', 'w', 'p', 'a'}

字典推导式

快速构建键值映射关系。

# 将单词与其长度配对
word_length_map = {word: len(word) for word in words}
# 结果: {'hello': 5, 'world': 5, 'python': 6, 'ai': 2}

嵌套推导式

处理多层结构时特别有用,但应避免过度嵌套以保持可读性。

matrix = [[1, 2], [3, 4], [5, 6]]

# 展平二维数组
flattened = [num for row in matrix for num in row]
# 结果: [1, 2, 3, 4, 5, 6]

# 等价于以下循环逻辑:
# flattened = []
# for row in matrix:
#     for num in row:
#         flattened.append(num)

当涉及三层及以上嵌套时,建议改用普通循环提升代码清晰度。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。