Python:';字符串索引超出范围';
我快速搜索了一下,但找不到任何有助于解决问题的东西 我正在尝试制作一个程序,获取前5个数字并获取它们的产品来源,如果该产品是迄今为止发现的最大的产品,则将其设置为这样 我的代码是:Python:';字符串索引超出范围';,python,Python,我快速搜索了一下,但找不到任何有助于解决问题的东西 我正在尝试制作一个程序,获取前5个数字并获取它们的产品来源,如果该产品是迄今为止发现的最大的产品,则将其设置为这样 我的代码是: string = str(integer) x = 0 largest = 0 stringlength = len(string) while x < stringlength: a = int(string[x]) b = int(string[x+1]) c = int(str
string = str(integer)
x = 0
largest = 0
stringlength = len(string)
while x < stringlength:
a = int(string[x])
b = int(string[x+1])
c = int(string[x+2])
d = int(string[x+3])
e = int(string[x+4])
if (a*b*c*d*e > largest):
largest = a*b*c*d*e
print(largest)
x += 1
print(largest)
string=str(整数)
x=0
最大值=0
stringlength=len(字符串)
当x最大值):
最大=a*b*c*d*e
打印(最大)
x+=1
打印(最大)
我排除了整数值本身,但作为参考,它有1000位长。每当我试图运行这段代码时,我都会得到“IndexError:stringindex超出范围”。有人能帮忙吗?string=str(整数)
string = str(integer)
x = 0
largest = 0
stringlength = len(string)
while x < stringlength-4: # going to -5 would be out of rangue
a = int(string[x])
b = int(string[x+1])
c = int(string[x+2])
d = int(string[x+3])
e = int(string[x+4])
if (a*b*c*d*e > largest):
largest = a*b*c*d*e
print(largest)
x += 1
print(largest)
x=0
最大值=0
stringlength=len(字符串)
而x最大值):
最大=a*b*c*d*e
打印(最大)
x+=1
打印(最大)
这是一个经典错误(或者,在本例中是off-by-4错误)
当x
到达stringlength-4
时,x+4
为stringlength
,超过字符串的末尾。因此,您需要x
,而不是x
但您可能需要考虑重新编写代码以使用更高级的抽象,使这些问题更难理解和更容易思考。
首先,与此相反:
x= 0
while x < stringlength:
# ...
x += 1
然后,您可以通过以下方法解决您的问题:
for x in range(stringlength-4):
但让我们更进一步
如果对字符串进行切片,则不会得到索引器
:
for x in range(len(stringlength)):
a, b, c, d, e = map(int, string[x:x+4])
但是,现在您将在解包中得到一个ValueError
。但实际上,您不需要在这里分解成5个单独的变量。只需保留序列并将其相乘即可。(您可以通过循环来实现这一点,但在我看来,这是为数不多的几种情况之一,reduce
是用Python编写东西的最可读的方式。)
现在没有更多的错误,但这是因为您将最后4、3、2和1的数字相乘。这正是问题所在:你从来没有决定那里应该发生什么
所以,现在,你可以做出明确的决定。您想将它们作为批计算,还是跳过它们
如果您想更进一步,可以使用itertools
编写滑动窗口grouper函数,这是一个类似于zip
的版本(当窗口右边缘离开列表末尾时停止),另一个类似于zip\u longest
的版本(仅当窗口左边缘离开时停止):
现在,您可以这样做:
for x in range(stringlength):
for group_of_five in groupwise_longest(string, 5, 1):
values = map(int, group)
prod = reduce(operator.mul, values)
if prod > largest:
largest = prod
print(largest)
然后,如果您决定不比较末尾的不完整组,只需将第一行更改为:
for group_of_five in groupwise(string, 5):
然后,您可以将所有工作移出for
循环:
groups = groupwise_longest(string, 5, 1)
intgroups = (map(int, group) for group in groups)
prods = (reduce(operator.mul, group) for group in groups)
现在我们有了一系列产品,很明显,要找到最高的产品,那就是:
print(max(prods))
例如:
>>> string = '12345678987654321'
>>> groups = groupwise(string, 5)
>>> intgroups = (map(int, group) for group in groups)
>>> prods = (reduce(operator.mul, group) for group in groups)
>>> max(prods)
28224
请注意,没有任何地方可以弥补一个错误或任何其他“小”错误。当然,您仍然可能会犯完全错误,或者根本不知道如何编写,但至少您的错误将是明显的大错误,更易于调试。谢谢您的B,我也明白了我的错误所在。哦,新事物的悲哀。比较严格,x
意味着,最多,x+4
将等于stringlength-1
。这已经是一个写得很好的问题,但为了将来的参考,如果不忽略整数,您已经用一个较小的整数(比如12345678987654321)进行了测试,并验证了它存在相同的问题。然后,您可以发布完整的、正在运行的(直到您需要帮助的错误)代码,并描述预期的输出,而不是解释为什么您给我们提供了不完整的代码。顺便说一句,在我的计算机上快速搜索各种项目时,groupwise
(这可以被看作是来自itertools配方的成对的
,或来自更多itertools的分块的
)被称为窗口的
,幻灯片
,以及n方面的
…
print(max(prods))
>>> string = '12345678987654321'
>>> groups = groupwise(string, 5)
>>> intgroups = (map(int, group) for group in groups)
>>> prods = (reduce(operator.mul, group) for group in groups)
>>> max(prods)
28224