我试图编写一个函数,当给出一个由逗号和目标数字分隔的数字或字符串的列表时,将在该列表中找到与目标相等或可能成为目标的数字数。
数字可以通过食用小于或等于它们的数字而改变,在吃完一个数字之后,较大的数字将增长1,而较小的数字消失。
函数检查提供列表中的所有数字,所以如果你有27,9, 11 , 10 ,8并且你的目标是12,那么函数应该返回3,因为11可以吃10,10可以吃9,8可以吃12,9可以吃8,然后它现在可以吃10,然后11可以吃12。
我的问题是,当目标4提供了3,3,3,2,2,2,1,1这样的值时,我的函数返回错误的值(值应该是9)。由于某些原因,我的函数不识别与可以被吃掉的数字相等的数字,即使在if语句中有一个">=“。
def cannibal(l, target):
try:
l = l.split(",")
l.sort(reverse = True)
l = list(map(int, l))
print (l)
except:
l.sort(reverse = True)
print (l)
finally:
eatingl = l[:]
count = 0
flag = True
for i in range(0,len(l)-1):
if l[i] > target:
print (l[i],"got skipped at",i)
continue
if l[i] == target:
print (l[i],"at",i,"got added")
count += 1
continue
if l[i] < target:
while flag:
if eatingl[i] < target and len(eatingl) == 1:
flag = False
break
if eatingl[i] == target:
(eatingl[i],"at",i,"got added")
count +=1
flag = False
break
for j in range(0,len(eatingl)):
if eatingl[i] == eatingl[j]:
continue
print (eatingl[i],eatingl[j])
if eatingl[i] >= eatingl[j]:
print (eatingl[i],"is eating",eatingl[j])
eatingl.remove(eatingl[j])
eatingl[i] += 1
break
if eatingl[i] > target:
flag = False
break
print (count)
return count发布于 2020-05-31 20:11:46
我的函数不识别等于数字的数字,即使在if语句中有一个">=“,也可以吃掉它。
在您的代码中只有一个>=,并且在此之上不远的是:
if eatingl[i] == eatingl[j]:
continue这一行阻止一个数字吃等号。你想让这条线阻止一个号码自己吃吗?如果是这样,则需要上面的条件为if i == j:。
但是,您的代码还有其他一些问题:
一旦找到一个可以到达目标的数字,
eatingl = l[:]来完成这个任务,但是它在for i in ...循环之外。将它移动到inside.if eatingl[i] == target:,您有下面的行。(吃里,"at",i,"got“)
这将一个包含四个项目的元组组合在一起,然后扔掉它,因为它没有做任何事情。我猜您缺少了一个here.
print循环开始之前,变量flag设置为True。一旦这个变量被设置为False,while循环就不会再被输入,所以您的程序将永远不会找到一个以上的食人号。相反,将行flag = True移到while循环的正上方。
eatingl中删除。这在j > i时不会造成问题,但在j < i时会造成问题,因为删除索引j处的数字会将索引i处的数字移动到索引i - 1,然后在索引i处增加数字,这可能是一个不同的数字。添加到正在迭代的列表中或从列表中删除项通常会导致问题。与删除数字不同,用占位符值(如0、-1或None )替换数字更为简单。您需要确保不尝试吃一个已经被吃掉的数字,并且可以通过在检查eatingl[i] >= eatingl[j].
j循环的末尾而不使用break之前检查eatingl[j]不是占位符来做到这一点,这样eatingl[i]就没有足够的其他数字可以到达目标。在这种情况下,您可能希望break退出while循环。最简单的方法是将else子句添加到for循环中:其他:print(“不能再为”,eatingli)标志=假中断
上面的else行应该与for j in ...行对齐。一个break.
else块,如果for循环中的代码不应该是for i in range(0,len(l)):而不是for i in range(0,len(l)-1):,那么else块中的代码就会运行。如果您有一个唯一最小的数字,就像在您的示例27,9,11,10,8中一样,这不是一个问题:一个唯一的最小数字不能吃掉任何其他数字,所以跳过它不会有任何害处。但是在你的例子中,3,3,3,2,2,2,1,1,其中最小的数是1,其中有三个,每个1都可以吃掉另外两个1,然后2变成4。我对您的代码做了这些更改,它给了我预期的输出。
https://stackoverflow.com/questions/62120762
复制相似问题