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

如何对比字符串数字:判断字符存在但位置不同(聚焦第二个elif语句)

问题描述

我正在尝试对比两个字符串中的数字:guess_str是输入值转换后的字符串,num_str是随机生成数字转换后的字符串。
示例:

  • guess_str: 100
  • num_str: 201
    需要实现两者的对比,当输入100作为guess_str时,能识别出输入的“1”存在于num_str中但位置不同。
    我仅关注代码中的第二个elif语句。

原代码

import random  # 原代码缺失该导入,补充以保证运行
num = random.randint(100,999)
attempts = 1
max_attempts = 10

print(main())  # 原代码未定义main函数,此处存在逻辑问题
print(num)

while attempts <= max_attempts:
    guess = int(input(f"Guess#{attempts}:\n> "))
    if guess == num:
        print("Hooray!! That is the correct number!")
      
        answer = input("Enter yes or no: ")
        if answer.lower() == "yes":
            main()
        elif answer.lower() == "no":
            print("Ok have a great day!")
            break

    else:
        guess_str = str(guess)
        num_str = str(num)
      
        for i, val in enumerate(str(num)):
            if guess_str[i] == val:
                print("Fermi".format(i))
          
            elif any(x in num_str for x in guess_str):
                print("Pico")
          
            elif guess_str != num_str:
                print("Bagels")
                break
          
        #adds attempt to game  
            else:
                attempts += 1
问题分析与修复

原代码的第二个elif逻辑存在缺陷:any(x in num_str for x in guess_str)仅判断任意数字存在于目标字符串,但未排除已经匹配位置的数字(即已触发Fermi的情况),且循环逻辑会导致重复输出。

要实现“数字存在但位置不同”的判断,核心修改如下:

修复后的核心对比逻辑

else:
    guess_str = str(guess)
    num_str = str(num)
    fermi_count = 0
    pico_count = 0

    # 逐个字符对比,统计Fermi和Pico数量
    for i in range(3):
        if guess_str[i] == num_str[i]:
            fermi_count += 1
        # 仅当数字存在但位置不匹配时,统计Pico
        elif guess_str[i] in num_str:
            pico_count += 1
    
    # 组装输出结果
    output = []
    if fermi_count > 0:
        output.append(f"{fermi_count} Fermi")
    if pico_count > 0:
        output.append(f"{pico_count} Pico")
    
    if not output:
        print("Bagels")
    else:
        print(" ".join(output))
    
    attempts += 1  # 将次数递增移至循环外,修正原代码逻辑错误

关键修改点

  1. 针对第二个elif:新增位置判断,仅在数字存在且位置不匹配时统计为Pico,避免和Fermi的情况重复
  2. 调整attempts += 1的位置,原代码放在循环内会导致每次字符对比都递增次数,逻辑完全错误
  3. 增加计数逻辑,避免重复打印(比如示例中guess_str=100、num_str=201时,会输出1 Pico)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:03:16