测试列表中所有可能性的程序

2024-05-19 14:42:35 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我想开始我的Python之旅,所以我的代码肯定会反映这一点。我试图编写一个程序,通过返回真或假来检查输入的数字是否是卡普雷卡数。为此,我创建了以下函数:

def list_to_num(list):(以int形式返回列表)

def num_to_list(num):(以列表形式返回int)

主程序:

def is_kaprekar_number(num):
  
  square = num ** 2

  listeNum = num_to_list(square)

  x = 0
  p1 = listeNum[:x]
  p2 = listeNum[(x+1):]

  for i in range(len(listeNum)):
    if list_to_num(p1) + list_to_num(p2) == num:
      return 'True'
    else:
      return 'False'
  x += 1
    
print(is_kaprekar_number(9))

输出返回False

我的主要问题是,我正在努力测试一个列表中的所有可能性,该列表是从我试图测试的数字的平方转换而来的。i、 e 45^2=2025

第一次迭代=2+025=27,错误-检查下一次迭代

第二次迭代=20+25=45,true,返回true

提前多谢


Tags: tonumber列表isdef数字num形式
2条回答

我不喜欢这样,我不能在注释中格式化代码。您的循环没有正确嵌套;您只拆分了一次列表,然后多次检查同一字符串。另外,在尝试所有变体之前,不能返回False。以下是一个有效的版本:

def is_kaprekar_number(num):
    square = num ** 2
    listeNum = num_to_list(square)

    for x in range(len(listeNum)):
        p1 = listeNum[:x+1]
        p2 = listeNum[x+1:]
        print(p1,p2)

        if list_to_num(p1) + list_to_num(p2) == num:
            return True
    return False
        
print(is_kaprekar_number(45))

我想你的问题是,尽管92=81和8+1=9(这有助于明确这些事情),为什么这会返回False

首先,p1,p2在您的循环之外,因此它们只计算一次,从不更新。很容易修复-只需将它们移动到循环体中即可

其次,return语句终止is_kaprekar_number,这意味着在第一次尝试后不会有任何额外的循环调用。如果找到合适的拆分,您希望立即终止,但如果没有,则继续,并且只有在用尽所有可能的拆分后才返回False。因此,您需要删除else条件并将return False移到循环之外

第三,python切片的上限是不包含的-[0:x]不包含xth元素,因此切片总是排除一个数字。 我将把明确的解决方案留给您(或其他回答者)来完成

最后,介绍一些让您的生活更轻松的python通用习惯用法:

想要列表的前x个元素吗l[:x] 想要名单的其余部分吗l[x:]

需要非负整数的数字吗?转换为字符串str(i)。 已完成字符串切片,需要返回整数吗int(s) (注意:在这种特殊情况下,您不需要这样做,因为您必须修改程序逻辑的其余部分,以避免尝试转换空字符串)

使用已经是python类型的变量名,如listDon't do that!

除非有必要,否则不要在for循环中使用计数器,也不要在不使用的东西上循环

相关问题 更多 >