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

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

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

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

在 Java 中,我们依赖 ArrayList、HashMap、HashSet 等集合类处理数据,

配合 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 对应:无直接等价物(可用 record 或 Pair)

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)"如何自动释放资源。

相关推荐
青少儿编程课堂21 分钟前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
怕浪猫1 小时前
LLM 面试必问的 8 个问题,答不上来直接淘汰
人工智能·python·面试
老歌老听老掉牙2 小时前
从三维旋转的深度解析到Python实现:绕任意轴旋转的奥秘
python·三维旋转
打工仔折腾 AI2 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
梦幻精灵_cq2 小时前
sumdir——一个伪python.built-in的“术法”打造
python
weixin_440730504 小时前
函数return、参数、参数组、递归函数、高阶函数等小结
开发语言·python
天赐范式4 小时前
天赐范式第181天:让视图开始切换——PBFT视图切换与从safety到liveness的跨越
python·pbft·数字生命·天赐范式·动态运行时·拜占庭容错
sugarzhangnotes4 小时前
【无标题】
开发语言·人工智能·python
weixin_447195295 小时前
【无标题】
pytorch·python
迅猛龙办公室5 小时前
Python实现简单的人名对话
python