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

Python列表存储用户输入重复问题:输入被多次追加而非单次

问题分析与解决方案

核心问题所在

你的代码出现两个关键错误,导致列表被重复填充:

  1. 输入收集阶段的逻辑冗余且错误:
    第一个循环里的if i >=0分支完全没必要(因为enumerate(range(moves))的i从0开始,else分支永远不会执行)。更严重的是,当i=0(第一次输入)时,你尝试访问player_move_dif[i-1]也就是player_move_dif[-1]——这时候列表刚添加了第一个元素,所以你实际上是把当前输入同时当成了「当前移动」和「前一次移动」,这不符合逻辑。

  2. 分类循环的重复执行:
    第二个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:32:27