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

请修改pleaseConformOnePass:优化打印指令并修复空列表崩溃问题

修改pleaseConformOnePass函数:生成自然指令并兼容空列表

问题背景

我正在学习Srini Devadas所著《Programming for the Puzzled》第一章中的pleaseConform与pleaseConformOnePass程序。章节末尾的第二个练习要求修改pleaseConformOnePass函数,使其满足:

  • 输出更自然的指令(示例如下)
  • 传入空列表时不会崩溃

自然指令示例

'People in positions 2 through 4 flip your caps!'
'People in positions 6 through 8 flip your caps!'
'Person at position 11 flip your cap!'

原代码问题

原演示代码如下:

def pleaseConformOnePass(caps):
    caps = caps + [caps[0]]
    for i in range(1, len(caps)):
        if caps[i] != caps[i - 1]:
            if caps[i] != caps[0]:
                print(f"People in positions {i}", end="")
            else:
                print(f" through {i-1}, please flip your caps!")

存在两个问题:

  1. 传入空列表时,caps[0]会触发索引错误,导致程序崩溃。
  2. 输出格式生硬,无法区分单个位置和区间的情况,也不符合示例的自然表述。

解决方案

以下是修改后的函数,同时解决了这两个问题:

def pleaseConformOnePass(caps):
    # 处理空列表,直接返回避免崩溃
    if not caps:
        return
    
    # 复制原列表并添加哨兵元素,避免修改输入列表本身
    caps_copy = caps.copy()
    caps_copy.append(caps_copy[0])
    start_pos = None
    
    for i in range(1, len(caps_copy)):
        if caps_copy[i] != caps_copy[i-1]:
            if caps_copy[i] != caps_copy[0]:
                # 记录翻转区间的起始位置(题目中位置从1开始计数)
                start_pos = i
            else:
                # 翻转区间结束,生成对应指令
                end_pos = i - 1
                if start_pos == end_pos:
                    print(f'Person at position {start_pos} flip your cap!')
                else:
                    print(f'People in positions {start_pos} through {end_pos} flip your caps!')

修改说明

  • 空列表兼容:函数开头增加if not caps: return判断,直接返回避免访问空列表的索引。
  • 避免副作用:使用caps.copy()复制原列表,再添加哨兵元素,不会修改传入的原始列表。
  • 自然指令生成:
    • 用start_pos记录每个翻转区间的起始位置。
    • 当区间结束时,判断起始和结束位置是否相同:
      • 相同则输出单个位置的指令(用Person和position单数形式)。
      • 不同则输出区间指令(用People和positions复数形式,搭配through连接区间)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:17