You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写《十二天的圣诞节》歌词打印程序遇循环与类型错误求助

解决《十二天的圣诞节》歌词生成问题

错误原因

你碰到的TypeError: '<' not supported between instances of 'str' and 'int',是因为循环里把字符串类型的序数词(比如'first')和整数做了大小比较,比如写了类似if day < 12但day是字符串的情况。

解决方案

核心思路是把天数的数字、序数词、对应礼物整理成结构化数据,然后通过循环数字来逐段构建歌词,用join()拼接礼物列表避免重复代码:

# 准备对应数据:序数词、礼物(按天数顺序,最后一个是第一天的礼物)
ordinal_days = [
    'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
    'seventh', 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth'
]

gifts = [
    'A Partridge in a Pear Tree',
    '2 Turtle Doves',
    '3 French Hens',
    '4 Calling Birds',
    '5 Gold Rings',
    '6 Geese a-Laying',
    '7 Swans a-Swimming',
    '8 Maids a-Milking',
    '9 Ladies Dancing',
    '10 Lords a-Leaping',
    '11 Pipers Piping',
    '12 Drummers Drumming'
]

# 循环生成每一段歌词
for day_num in range(12):
    # 构建开头部分
    verse_start = f"""On the {ordinal_days[day_num]} day of Christmas
my true love sent to me:"""
    
    # 构建礼物列表:从当前天数倒着取到第一天的礼物
    current_gifts = gifts[day_num::-1]
    
    # 处理最后一个礼物的格式(除了第一天,要加and)
    if day_num > 0:
        current_gifts[-1] = f"and {current_gifts[-1]}"
    
    # 用join拼接礼物,每行一个
    verse_gifts = '\n'.join(current_gifts)
    
    # 组合并打印整段
    full_verse = f"{verse_start}\n{verse_gifts}\n"
    print(full_verse)

代码说明

  1. 用两个列表分别存储序数词和对应礼物,索引一一对应(第0个元素对应第一天)
  2. 循环day_num从0到11(对应12天),通过索引取对应的序数词和礼物
  3. gifts[day_num::-1]会从当前天数的礼物倒着取到第一个礼物,正好符合歌词每段新增前一段内容的要求
  4. 除了第一天,最后一个礼物(也就是鹧鸪那段)前面要加and,单独处理后用'\n'.join()把礼物列表拼成每行一个的字符串
  5. 最后把开头和礼物部分拼接,打印每一段

内容的提问来源于stack exchange,提问作者TahaAvadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:30:58