Python:';字符串索引超出范围';

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

我快速搜索了一下,但找不到任何有助于解决问题的东西

我正在尝试制作一个程序,获取前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(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