跳到主要内容

核心数据类型与容器

Python 最有代表性的体验之一,就是内置容器足够好用。很多问题不需要自己从零实现复杂结构,先把 listtupledictset 用顺,效率就会高很多。

先建立一个选择框架

  • 有序、可修改、允许重复:list
  • 有序、不可修改:tuple
  • 键值映射:dict
  • 去重、集合运算、快速成员判断:set

list:最常用的顺序容器

numbers = [1, 2, 3]
numbers.append(4)
numbers[0] = 100
print(numbers[1:3])

常见动作:

  • append():尾部追加
  • extend():拼接多个元素
  • pop():删除并返回元素
  • sort():原地排序

tuple:更轻、更稳定的固定数据

point = (3, 5)
x, y = point

我一般在这些场景下用元组:

  • 函数返回多个值
  • 表达一个不会变的结构,例如坐标、颜色、配置项
  • 希望这个对象能作为字典键或集合元素

dict:键值映射

user = {"name": "alice", "score": 95}

print(user["name"])
print(user.get("age", 0))
user["city"] = "Chengdu"

我最常用的几个动作:

  • get():安全取值
  • items():同时遍历键和值
  • keys() / values()
  • update():批量更新

set:去重和成员判断

visited = {"a", "b", "c"}
visited.add("d")
print("a" in visited)

集合特别适合:

  • 去重
  • 判断某个元素是否出现过
  • 并集、交集、差集这类集合运算

更完整的内容可以直接看:

容器推导式

Python 里很多“遍历并生成新结果”的动作,都可以用推导式表达:

squares = [x * x for x in range(5)]
score_map = {name: len(name) for name in ["alice", "bob"]}
unique_lengths = {len(name) for name in ["alice", "bob", "eve"]}

不可变和可变要分清

很多坑都不是语法问题,而是“对象能不能被改”的问题。

  • 可变对象:listdictset
  • 不可变对象:intfloatstrtuple

如果你把一个列表赋值给另一个变量,得到的是“同一个对象的另一个名字”,不是拷贝。

相关问题可以直接看:

标准库里几个常用补充

除了四大基础容器,下面几个也很值得记住:

  • collections.deque:双端队列
  • collections.Counter:计数器
  • collections.defaultdict:带默认值的字典
  • heapq:堆

我的使用习惯

  • 默认先想 list
  • 需要通过名字取值时改用 dict
  • 需要去重或判重时马上想到 set
  • 需要固定结构时用 tuple

关联阅读