下面的[incomplete]代码旨在接收长度为xn的n到x的数字,并返回下一个全数字的数字的值。该代码标识作为函数参数传递的数字中缺少n和x之间的数字,并返回(暂时,直到进一步开发该函数)两个列表,原始数字本身以及其各个数字作为列表的成员,以及一个列表,其中数字n到x作为成员,而长度为xn的原始数字中存在的那些数字被布尔值True代替。
def nextPandigital(n,lower,upper):
digits = []
requiredDigits = []
#Completed loop
for digit in str(n):
digits.append(int(digit))
#Completed loop
for num in range(lower,upper+1):
requiredDigits.append(num)
for number in requiredDigits:
if str(number) in str(digits):
x = requiredDigits.index(number)
#requiredDigits[x] = 'True'
requiredDigits[x] = True
return digits, requiredDigits
尽管,对于nextPandigital(1023456789,0,9)
Enthought Canopy中的输入参数,应该读取返回[True,True,True,True,True,True,True,True,True,True]
的第二个列表,但实际上返回的第二个列表的值是[True,1,True,True,True,True,True,True,True,True]
原始requiredDigits
列表中的1不替换为True
。
我知道,有与循环,或代码的一般流程没有问题,当为requiredDigits[x] = True
的代码行被注释掉,并且当前注释的代码注释掉的代码工作,因为它的目的是,与所有数字在requiredDigits
被替换为字符串值“ True.
”
我试图解决此问题。但是,我无法查明其来源。我已经考虑过True == 1
返回True的事实。但是,当在行中将值True替换为False时,requiredDigits[x] = True
代码仍将按预期工作。
任何对此问题的答案/帮助/建议/建议将不胜感激。先感谢您。
问题在于使用index
查找要分配到的位置。由于True
等于1,您误认为True
输入的0
是1
您要替换的下一个。
一种解决方案是在enumerate
遍历列表时使用获取索引,而不是以后需要使用查找索引index
:
for x, number in enumerate(requiredDigits):
if str(number) in str(digits):
requiredDigits[x] = True
通常,更好的解决方案是使用列表理解一次创建列表,而不是从数字开始并在以后替换其中一些:
requiredDigits = [True if num in digits else num for num in range(lower,upper+1)]
我还摆脱了str
针对的会员资格测试中不必要的呼叫digits
。您正在进行子字符串测试,而不是测试数字本身是否在列表中。那可能不会造成错误,因为您关心的数字都是一个数字长,并且列表的字符串表示形式没有任何多余的数字。但总的来说,在不需要时使用字符串操作不是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句