Python列表存储用户输入重复问题:输入被多次追加而非单次
问题分析与解决方案
核心问题所在
你的代码出现两个关键错误,导致列表被重复填充:
输入收集阶段的逻辑冗余且错误:
第一个循环里的if i >=0分支完全没必要(因为enumerate(range(moves))的i从0开始,else分支永远不会执行)。更严重的是,当i=0(第一次输入)时,你尝试访问player_move_dif[i-1]也就是player_move_dif[-1]——这时候列表刚添加了第一个元素,所以你实际上是把当前输入同时当成了「当前移动」和「前一次移动」,这不符合逻辑。分类循环的重复执行:
第二个for turn in range(moves)循环会执行moves次,但循环内部没有更新player_move_2和player_previous_move的值——它一直使用第一个循环最后一次迭代的结果。比如你执行5轮,这个循环会把同一个移动对重复判断5次,每次都往对应列表里追加一次,最终列表长度变成5*5=25。
另外,你尝试用extend替换append出错,是因为extend要求传入可迭代对象(比如列表、字符串),而你传入的是单个整数(player_move_2是int类型),整数不是可迭代对象,所以触发TypeError。
修正后的代码
下面是修复后的完整代码,同时优化了逻辑可读性:
moves = int(input("Enter the number of moves: ")) player_moves = [] throw00 = [] throw01 = [] throw10 = [] throw11 = [] # 第一步:正确收集所有用户输入,转成整数存储 for turn_num in range(1, moves + 1): while True: # 加个输入验证,避免用户输入非0/1的内容 try: move = int(input(f"Choose your move number {turn_num} (0 or 1): ")) if move in (0, 1): player_moves.append(move) break else: print("Please enter either 0 or 1!") except ValueError: print("Invalid input! Please enter an integer.") # 第二步:遍历连续的移动对(从第2次移动开始,因为需要前一次的记录) for i in range(1, len(player_moves)): current = player_moves[i] previous = player_moves[i-1] if current == 0 and previous == 0: throw00.append(current) elif current == 0 and previous == 1: throw01.append(current) elif current == 1 and previous == 0: throw10.append(current) else: throw11.append(current) # 测试输出 print(f"throw00 length: {len(throw00)}") print(f"throw01 length: {len(throw01)}") print(f"throw10 length: {len(throw10)}") print(f"throw11 length: {len(throw11)}")
关键优化点说明
- 输入收集阶段:添加了输入验证,确保用户只能输入0或1,避免后续逻辑出错;同时直接把输入转成整数存储,省去后续重复转换的步骤。
- 分类阶段:只遍历从第2个元素开始的索引(
range(1, len(player_moves))),每一次迭代都取当前移动和前一次移动来判断分类,确保每一对连续移动只被处理一次。如果你的需求是要把第一次移动也纳入分类(比如默认前一次移动和当前相同),可以在循环前单独处理第一个元素:if player_moves: first_move = player_moves[0] if first_move == 0: throw00.append(first_move) else: throw11.append(first_move)
内容的提问来源于stack exchange,提问作者Jack Someone
相关产品推荐
相关产品推荐

