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。
💡 思路提示
点开看提示
- 条件过滤和转换可以同时存在:
[x for x in xs if 条件] p.strip() != ""判断是否非空白- 或者
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,代码会变得难读。该用普通循环就用普通循环。
可读性 > 简洁性。