本文介绍如何将模板中以 `- [ ]` 开头的选项列表,自动转换为带小写字母编号(如 `a. selection one`)的格式,适用于生成题干、问卷或文档类输出。
在 Python 中实现字母序号(a, b, c, …)编号,本质是将索引 0, 1, 2, ... 映射为 ASCII 字符 'a', 'b', 'c', ...,可借助 chr(ord('a') + i) 完成。关键在于:安全提取原始文本内容(去除 -[ ] 前缀),并按行枚举、逐行重写。
以下是你原 __str__ 方法中 options 字段的优化方案:
from operator import attrgetter
def __str__(self):
# 按 order 排序选项(保持逻辑不变)
self.options.sort(key=attrgetter('order'))
# 构建带字母编号的选项列表:a. xxx, b. xxx, ...
numbered_options = []
for i, option in enumerate(self.options):
# 使用 chr(97 + i) → 'a', 'b', 'c', ...;97 是 'a' 的 ASCII 码
if i >= 26:
raise ValueError("Too many options: alphabetical numbering supports only a–z (26 items)")
letter = chr(97 + i) # 97 → 'a', 98 → 'b', etc.
numbered_options.append(f"{letter}. {option}")
correct_selection = ", ".join(
str(selection) for selection in self.options if selection.correct
)
return _TEMPLATE.safe_substitute({
'dilemma_ethos': self.text,
'options': "\n".join(numbered_options), # 替换为字母编号版本
'correct_selection': correct_selection,
})✅ 注意事项:
? 进阶提示(支持 >26 项):
如需扩展至 27+ 项(如 aa, ab, ac…),可引入如下通用函数:
def alphabetize(items):
from string import ascii_lowercase
result = []
for i, item in enumerate(items):
q, r = divmod(i, 26)
prefix = ascii_lowercase[r]
if q > 0:
prefix = ascii_lowercase[q - 1] + prefix # aa, ab, ..., az, ba...
result.append(f"{prefix}. {str(item).strip()
}")
return result但对绝大多数教育/测试场景,a–z 编号已足够——简洁、直观、符合阅读习惯。
立即学习“Python免费学习笔记(深入)”;