Python 的数据结构实战——List、Dict、Set 与 List Comprehension

Python 的数据结构实战------List、Dict、Set 与 List Comprehension

写给习惯 ArrayList、HashMap 和 Stream API 的你

本文是《从 Java 到 Python:一位后端工程师的零基础学习之旅》系列的第六篇。

在 Java 中,我们依赖 ArrayListHashMapHashSet 等集合类处理数据,

配合 Stream API 实现过滤、映射、聚合等操作------代码虽强,但往往需要多行。

而在 Python 中,列表(List)、字典(Dict)、集合(Set) 不仅是基础数据结构,

更是语言级的"第一公民",配合列表推导式(List Comprehension)
一行代码就能完成 Java 中需要 stream().filter().map().collect()的复杂逻辑

今天,我们就深入这三大核心数据结构,并体验 Python 如何用更简洁、更可读的方式处理数据。


一、List:不只是"动态数组"

Java 对应:ArrayList<T>

java 复制代码
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
System.out.println(fruits.size()); // 2

Python List:

python 复制代码
fruits = ["apple", "banana"]
fruits.append("cherry")
print(len(fruits))  # 3

🔍 核心特性:

  • 异构容器:可混合不同类型(但建议保持一致)
python 复制代码
mixed = [1, "hello", True, [2, 3]]  # 合法,但不推荐
  • 切片(Slicing):强大子集操作
python 复制代码
nums = [0, 1, 2, 3, 4]
print(nums[1:4])    # [1, 2, 3]
print(nums[::-1])   # [4, 3, 2, 1, 0](反转)

💡 对比 Java:

Java 需用 subList() 或手动循环,Python 切片是内置语法,高效且易读。


二、Dict:JSON 就是字典,字典就是对象

Java 对应:HashMap<K, V>JsonObject

java 复制代码
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice");
user.put("age", 25);

Python Dict:

python 复制代码
user = {
    "name": "Alice",
    "age": 25,
    "active": True
}
print(user["name"])        # Alice
print(user.get("email"))   # None(安全访问)

Dict 是 Python 的核心

  • API 请求/响应常直接转为 dict(无需 POJO)
  • 配置、缓存、上下文传递都用 dict
  • 关键字参数( **kwargs)底层就是 dict

💡 你熟悉的 JSON,在 Python 中就是 dict + list 的组合!


三、Set:去重与集合运算

Java 对应:HashSet<T>

java 复制代码
Set<String> tags = new HashSet<>();
tags.add("python");
tags.add("java");

Python Set:

java 复制代码
tags = {"python", "java", "python"}  # 自动去重 → {"python", "java"}

✅ 支持数学集合操作:

python 复制代码
a = {1, 2, 3}
b = {3, 4, 5}

print(a & b)   # 交集 → {3}
print(a | b)   # 并集 → {1, 2, 3, 4, 5}
print(a - b)   # 差集 → {1, 2}

🌟 用途:快速去重、成员检查(O(1) 时间复杂度)

python 复制代码
if "python" in tags:  # 比 list 的 in 快得多
    print("Tag exists")

四、List Comprehension:Python 的"表达力核武器"

这是 Java 开发者最容易"哇塞"的特性!

场景:从用户列表中提取所有活跃用户的姓名(大写)

Java(Stream API):
python 复制代码
List<String> activeNames = users.stream()
    .filter(user -> user.isActive())
    .map(user -> user.getName().toUpperCase())
    .collect(Collectors.toList());
Python(列表推导式):
python 复制代码
active_names = [user["name"].upper() for user in users if user["active"]]

一行完成过滤 + 映射

语法贴近自然语言:"对每个 user,如果 active,取 name 并转大写"

更多例子:

  1. 生成平方数列表

    squares = [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25]

  2. 嵌套循环(扁平化二维列表)

python 复制代码
matrix = [[1, 2], [3, 4]]
flat = [num for row in matrix for num in row]  # [1, 2, 3, 4]
  1. 字典推导式(Dict Comprehension)
python 复制代码
# 将列表转为 {index: value} 映射
items = ["a", "b", "c"]
index_map = {i: v for i, v in enumerate(items)}  # {0: 'a', 1: 'b', 2: 'c'}
  1. 集合推导式(Set Comprehension)
python 复制代码
unique_lengths = {len(word) for word in ["apple", "bat", "car"]}  # {3, 5}

💡 推导式是 Python 的惯用法(idiom) ,比 map()/filter() 更可读、更高效。


五、Tuple:不可变的轻量结构

Java 对应:无直接等价物(可用 recordPair

python 复制代码
record Point(int x, int y) {}

Python Tuple:

python 复制代码
point = (10, 20)
x, y = point  # 解包(unpacking)
print(x, y)   # 10 20

✅ 特点:

  • 不可变(创建后不能修改)
  • 可作为 dict 的 key(list 不行)
  • 函数多返回值的底层载体

📌 建议:当数据结构简单且不变时,优先用 tuple 而非 list。


六、实战:用 Python 数据结构重构你的 Java 逻辑

假设你在 Java 中有如下逻辑:

java 复制代码
// 从用户列表中找出所有 VIP 用户的邮箱(去重)
Set<String> vipEmails = users.stream()
    .filter(u -> "VIP".equals(u.getRole()))
    .map(User::getEmail)
    .collect(Collectors.toSet());

Python 版本:

java 复制代码
vip_emails = {user["email"] for user in users if user.get("role") == "VIP"}

✅ 一行完成:过滤 + 映射 + 去重

✅ 使用 集合推导式 ,天然去重

✅ 用 .get("role") 避免 KeyError(类似 Java 的 null-safe)


七、性能与选择建议

|---------|--------------|----------------------------|
| 结构 | 适用场景 | 时间复杂度(平均) |
| list | 有序、可变、允许重复 | append: O(1), in: O(n) |
| dict | 键值映射、快速查找 | get/set: O(1) |
| set | 去重、成员检查 | in/add: O(1) |
| tuple | 不可变序列、作为 key | 同 list,但不可变 |

📌 黄金法则

  • 需要映射关系 ?→ 用 dict
  • 需要去重或快速检查存在 ?→ 用 set
  • 需要顺序 + 可变 ?→ 用 list
  • 需要不可变序列 ?→ 用 tuple

结语:数据结构即语言

Java 的集合是"库提供的工具",

而 Python 的 List/Dict/Set 是"语言内置的思维单元"。

当你开始用 {k: v for ...} 构建配置,

[x for x in ... if ...] 过滤日志,

set(a) & set(b) 求交集,

你会发现:Python 的数据处理,不是在"调用方法",而是在"描述逻辑"

这种表达力,正是 Python 在数据科学、AI、脚本自动化领域不可撼动的原因。


下一篇预告 :《异常处理与文件操作------try/except vs try/catch,with open 的优雅之道》

我们将对比异常处理机制,并掌握 Python 中"上下文管理器(Context Manager)"如何自动释放资源。

相关推荐
apcipot_rain21 小时前
计科八股20260616(1)——堆存中位数、链表判环、黑白测试、敏捷开发与瀑布模型、配置管理、持续集成、池化
数据结构·算法·软件工程
闵孚龙1 天前
动态图机制:为什么 PyTorch 调试起来更舒服
人工智能·pytorch·python
JAVA面经实录9171 天前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
chushiyunen1 天前
langchain4j笔记、tools
笔记·python·flask
程序员三藏1 天前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
在放️1 天前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
财经资讯数据_灵砚智能1 天前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月14日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
影视飓风TIM1 天前
数据结构 | 链表超全笔记(单链表+双链表+高频算法题)
数据结构·笔记·链表
牛油果子哥q1 天前
STL set与map底层精讲,红黑树适配原理、有序去重特性、迭代器遍历、API实战与面试核心考点全解
开发语言·数据结构·c++·面试
JOJO数据科学1 天前
JupyterLab Electron 鸿蒙 PC 适配全记录:从 Python 原生崩溃到 node-static 本地工作台
python·electron·harmonyos