推理基础设施 · Python2.2 列表推导式
02
列表 / 字典操作 · 2 / 6

2.2 列表推导式

💡 推理预处理里 90% 的 list 操作都可以写成一行推导式

2.2 列表推导式

语法

[表达式 for 变量 in 可迭代对象 if 条件]
nums = [1, 2, 3, 4]
squares = [n*n for n in nums]                   # [1, 4, 9, 16]
evens   = [n for n in nums if n % 2 == 0]       # [2, 4]
labels  = ["big" if n > 2 else "small" for n in nums]

为什么推理代码里高频出现

  • 把 token id 列表转成 token 字符串:[tokenizer.decode([t]) for t in ids]
  • 过滤掉空 prompt:[p for p in prompts if p.strip()]
  • 给每个请求加序号:[{"id": i, "p": p} for i, p in enumerate(prompts)]

示范

prompts = ["hi", "", "hello", "   ", "ok"]
clean = [p for p in prompts if p.strip() != ""]
print(clean)                       # ['hi', 'hello', 'ok']

ids = [101, 202, 303]
texts = [f"tok-{t}" for t in ids]
print(texts)

✍️ 练习

输入:

prompts = ["  hi", "", "tell me a story", "  ", "ok"]

用一行列表推导式生成一个新的 list,里面的元素是 len(p) if p else 0(即:非空就是长度,空就是 0),只对 strip 后非空的 prompt 计算

打印这个新 list。

💡 思路提示

点开看提示
  1. 条件过滤和转换可以同时存在:[x for x in xs if 条件]
  2. p.strip() != "" 判断是否非空白
  3. 或者 if p.strip(),因为非空字符串本身是 Truthy

✅ 参考解法

写不出来再打开
prompts = ["  hi", "", "tell me a story", "  ", "ok"]
result = [len(p) if p.strip() else 0 for p in prompts if p.strip()]
print(result)

🔍 进阶思考

如果推导式里有 3 层 for 或 2 个 if,代码会变得难读。该用普通循环就用普通循环。

可读性 > 简洁性。