列车座位预订系统:嵌套列表值修改与标记问题求助
解决列车座位预订的标记问题
嘿,我来帮你搞定这个座位标记的问题!先拆解下你当前遇到的核心痛点,再一步步给出修复方案:
1. 嵌套列表的座位定位错误
你之前用field.index(chosenseat[i])把二维结构的field当成了一维列表处理,这肯定找不到正确的座位位置——毕竟每一行都是一个独立的子列表,得逐行遍历才能定位目标座位。
2. 循环索引越界问题
你的while i <= len(chosenseat)会触发索引越界,因为列表索引是从0到len(chosenseat)-1的。换成for循环直接遍历座位列表,既安全又简洁。
3. 整数转字符串的格式化顾虑
把整数转为字符串完全不会影响打印格式!只要在格式化输出时统一处理,不管是数字还是带标记的字符串,都能保持整齐的排版。
修复后的「添加预订标记」代码
# 假设chosenseat是用户选中的座位列表,比如[19,20] for seat in chosenseat: # 逐行遍历找目标座位 for row_idx, row in enumerate(field): if seat in row: elem_idx = row.index(seat) # 将整数座位转为带**标记的字符串 row[elem_idx] = f"*{seat}*" break # 找到座位就停止遍历,提升效率 # 打印格式化后的座位表 from math import floor for idx, row in enumerate(field): # 打印中间的提示文字 if idx == floor(len(field) / 2): print("{:^{}}".format('↓ TYST AVD ↓', (len(row) * 4) - 2)) # 保持奇数行翻转的原有逻辑 display_row = row[::-1] if idx % 2 == 1 else row # 统一转成字符串后格式化,确保对齐一致 print(("{:<4}" * len(display_row)).format(*(str(item) for item in display_row)))
「取消预订移除标记」的实现
要取消标记,反向操作即可:找到带*的座位字符串,还原为原本的整数:
# 假设cancel_seat是用户要取消的座位列表,比如[19] for seat in cancel_seat: target_str = f"*{seat}*" for row_idx, row in enumerate(field): if target_str in row: elem_idx = row.index(target_str) # 还原为原始整数座位号 row[elem_idx] = seat break
测试效果示例
当用户选择19和20时,处理后的座位表打印效果会和你预期的完全一致:
1 2 3 4
8 7 6 5
9 10 11 12
↓ TYST AVD ↓
16 15 14 13
17 18 19 20
24 23 22 21
另外建议你把field初始化为标准二维列表,比如:
# 对应你给出的座位布局示例 field = [ [1,2,3,4], [8,7,6,5], [9,10,11,12], [16,15,14,13], [17,18,19,20], [24,23,22,21] ]
这样整个定位和标记逻辑就能稳定运行啦!
内容的提问来源于stack exchange,提问作者Hvar01
相关产品推荐
相关产品推荐

