Python 目标返回不正确的食人族编号
我正在尝试编写一个函数,当给定一个由逗号分隔的数字列表或数字字符串以及一个目标数字时,该函数将查找该列表中与目标相等或可以成为目标的数字的数量 数字可以通过吃小于或等于数字的数字来改变,吃了一个数字后,较大的数字将增长1,较小的数字将消失。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
该函数检查所提供列表中的所有数字,因此如果您有[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")