Python节目查询功能:输入校验与实例访问问题求解
解决方案
核心思路
- 先提取所有有效节目名,用于输入合法性校验
- 循环接收用户输入,过滤空输入、无效节目名,直到获取合法输入
- 根据合法节目名查找对应数据,按要求格式输出
完整代码(基于Program类实现)
先修正类定义和数据格式(修复语法错误),再实现校验与查询逻辑:
class Program: def __init__(self, channel, start, end, name, viewers, percentage): self.channel = channel self.start = start self.end = end self.name = name self.viewers = viewers self.percentage = percentage # 补全未赋值的参数 # 修正后的节目数据嵌套列表(时间用字符串避免语法错误) programs_raw = [ [1, '16:00', '17:45', 100, 'Matinee: The kiss on the cross'], [1, '17:45', '17:50', 45, 'The stock market today'], [2, '16:45', '17:50', 30, 'News'], [4, '17:25', '17:50', 10, 'Home building'], [5, '15:45', '16:50', 28, 'Reality'] ] # 转换为Program实例列表 programs = [] for item in programs_raw: # 补全percentage参数(这里用0作为默认值,可根据实际调整) prog = Program(item[0], item[1], item[2], item[4], item[3], 0) programs.append(prog) def get_valid_program_name(): # 提取所有有效节目名,存入集合提升查询效率 valid_names = {p.name for p in programs} print('Enter the name of the desired program:') while True: user_input = input('>').strip() # 处理空输入 if not user_input: print('请输入非空的节目名称,请重试。') continue # 校验节目名是否存在 if user_input in valid_names: return user_input else: print(f"'{user_input}' 不在节目单中,请输入有效的节目名称。") print(f"可选节目:{', '.join(valid_names)}") def get_formatted_output(program_name): # 根据节目名查找对应实例并格式化输出 for prog in programs: if prog.name == program_name: # 将时间的冒号替换为点,匹配要求的输出格式 start = prog.start.replace(':', '.') end = prog.end.replace(':', '.') return f"{prog.name} {start}-{end} has {prog.viewers} viewers" # 主程序 if __name__ == "__main__": valid_name = get_valid_program_name() print(get_formatted_output(valid_name))
无需类的简化实现(直接用嵌套列表)
如果不想使用类,直接基于原始嵌套列表开发:
programs_list = [ [1, '16:00', '17:45', 100, 'Matinee: The kiss on the cross'], [1, '17:45', '17:50', 45, 'The stock market today'], [2, '16:45', '17:50', 30, 'News'], [4, '17:25', '17:50', 10, 'Home building'], [5, '15:45', '16:50', 28, 'Reality'] ] def get_valid_program_name(): valid_names = [item[4] for item in programs_list] print('Enter the name of the desired program:') while True: user_input = input('>').strip() if not user_input: print('请输入非空的节目名称,请重试。') continue if user_input in valid_names: return user_input else: print(f"'{user_input}' 不在节目单中,请输入有效的节目名称。") print(f"可选节目:{', '.join(valid_names)}") def get_formatted_output(program_name): for item in programs_list: if item[4] == program_name: start = item[1].replace(':', '.') end = item[2].replace(':', '.') return f"{program_name} {start}-{end} has {item[3]} viewers" if __name__ == "__main__": valid_name = get_valid_program_name() print(get_formatted_output(valid_name))
关键说明
- 输入校验:通过提取所有有效节目名,判断用户输入是否在列表内;同时处理空输入,避免无效值。
- 数据查询:遍历节目集合,匹配节目名后提取时间、观众数,按要求格式化输出。
- 语法修正:原嵌套列表中的时间(如
16:00)需改为字符串,否则Python会识别为非法语法。
内容的提问来源于stack exchange,提问作者Ella
相关产品推荐
相关产品推荐

