编写《十二天的圣诞节》歌词打印程序遇循环与类型错误求助
解决《十二天的圣诞节》歌词生成问题
错误原因
你碰到的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)
代码说明
- 用两个列表分别存储序数词和对应礼物,索引一一对应(第0个元素对应第一天)
- 循环
day_num从0到11(对应12天),通过索引取对应的序数词和礼物 gifts[day_num::-1]会从当前天数的礼物倒着取到第一个礼物,正好符合歌词每段新增前一段内容的要求- 除了第一天,最后一个礼物(也就是鹧鸪那段)前面要加
and,单独处理后用'\n'.join()把礼物列表拼成每行一个的字符串 - 最后把开头和礼物部分拼接,打印每一段
内容的提问来源于stack exchange,提问作者TahaAvadi
相关产品推荐
相关产品推荐

