Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 目标返回不正确的食人族编号_Python_Python 3.x_If Statement - Fatal编程技术网

Python 目标返回不正确的食人族编号

Python 目标返回不正确的食人族编号,python,python-3.x,if-statement,Python,Python 3.x,If Statement,我正在尝试编写一个函数,当给定一个由逗号分隔的数字列表或数字字符串以及一个目标数字时,该函数将查找该列表中与目标相等或可以成为目标的数字的数量 数字可以通过吃小于或等于数字的数字来改变,吃了一个数字后,较大的数字将增长1,较小的数字将消失。 该函数检查所提供列表中的所有数字,因此如果您有[27,9,11,10,8],且目标为12,则该函数应返回3,因为11可以吃10变为12,10可以吃9,8变为12,9可以吃8,那么它现在可以吃10,然后11变为12 我的问题是,当为目标4提供类似于[3,3,3

我正在尝试编写一个函数,当给定一个由逗号分隔的数字列表或数字字符串以及一个目标数字时,该函数将查找该列表中与目标相等或可以成为目标的数字的数量

数字可以通过吃小于或等于数字的数字来改变,吃了一个数字后,较大的数字将增长1,较小的数字将消失。
该函数检查所提供列表中的所有数字,因此如果您有[27,9,11,10,8],且目标为12,则该函数应返回3,因为11可以吃10变为12,10可以吃9,8变为12,9可以吃8,那么它现在可以吃10,然后11变为12

我的问题是,当为目标4提供类似于[3,3,3,2,2,2,1,1]的东西时,我的函数返回错误的值(值应该是9)。出于某种原因,我的函数无法识别与可食数字相等的数字,即使在if语句中有“>=”符号

def食人者(l,目标):
尝试:
l=l.split(“,”)
l、 排序(反向=真)
l=列表(映射(int,l))
印刷品(l)
除:
l、 排序(反向=真)
印刷品(l)
最后:
eatingl=l[:]
计数=0
flag=True
对于范围(0,len(l)-1内的i:
如果l[i]>目标:
打印(l[i],“被跳过”,i)
持续
如果l[i]==目标:
打印(l[i],“at”,i,“已添加”)
计数+=1
持续
如果l[i]<目标:
而国旗:
如果eatingl[i]<目标和len(eatingl)==1:
flag=False
打破
如果eatingl[i]==目标:
(eatingl[i],“at”,i,“got added”)
计数+=1
flag=False
打破
对于范围(0,len(eatingl))内的j:
如果eatingl[i]==eatingl[j]:
持续
打印(eatingl[i],eatingl[j])
如果eatingl[i]>=eatingl[j]:
打印(eatingl[i],“正在吃”,eatingl[j])
eatingl.remove(eatingl[j])
eatingl[i]+=1
打破
如果eatingl[i]>目标:
flag=False
打破
打印(计数)
返回计数
我的函数不识别等于可以吃的数字的数字,即使在if语句中有一个“>=”

在您的代码中只有一个
=
,在它上面不远的地方是:

如果eatingl[i]==eatingl[j]:
持续
这一行阻止一个数字吃掉一个相等的数字。你想让这一行阻止一个数字吃掉自己吗?如果是这样,那么如果i==j:则需要上述条件为

但是,您的代码还有一些其他问题:

  • 一旦你找到了一个可以达到目标的号码,你需要重新设置下一个号码的列表。您已经有一行
    eatingl=l[:]
    可以执行此操作,但它在
    for i in…
    循环之外。把它搬进去

  • 其次,如果eatingl[i]==target:
行下面有一行

                     (eatingl[i],"at",i,"got added")
这会将一个包含四个项的元组放在一起,然后将其丢弃,因为没有对其进行任何处理。我猜您在这里缺少了一个
打印

  • 第三,变量
    flag
    for i in…
    循环开始之前设置为
    True
    。一旦该变量设置为
    False
    ,就不会再次输入
    while
    循环,因此您的程序将不会找到多个食人族编号。相反,将行
    flag=True
    移动到
    while
    循环的正上方

  • 接下来,当一个数字被吃掉时,您将其从列表中删除
    eatingl
    。这在
    j>i
    时不会引起问题,但在
    j
    时会引起问题,因为删除索引
    j
    处的数字会将索引
    i
    处的数字移动到索引
    i-1
    ,然后增加索引
    i
    处的数字,这可能是一个不同的数字

    向列表中添加或从列表中删除要迭代的项通常会导致问题。使用占位符值(如
    0
    -1
    None
    )替换数字比删除数字更简单。您需要确保不要尝试吃已经吃过的数字,您可以在检查
    eatingl[i]>=eatingl[j]
    之前检查
    eatingl[i]>=eatingl[j]
    是否不是占位符

  • 如果您的程序到达
    j
    循环的末尾时没有
    中断
    ing,则
    eatingl[i]
    无法吃到足够的其他数字来达到目标。在这种情况下,您可能希望
    循环中中断
    。最简单的方法是将
    else
    子句添加到
    for
    循环:

    其他:
    打印(“不能再做了”,eatingl[i])
    flag=False
    打破
    
    上面的
    else
    行应与j in.
    行对齐。
    for
    循环可以有一个
    else
    块,如果
    for
    循环中的代码没有
    中断,则
    else
    块中的代码运行
                         (eatingl[i],"at",i,"got added")