首页 > 解决方案 > 如果带有 for 循环的 range() 没有准确到达结束编号会发生什么?

问题描述

这是 Leetcode 问题 13 Roman to Integer 的问题。我有一个 for 循环(第二个),其中每个循环增加 2,但我循环的字符串的长度为 3,因此循环永远不会达到确切的结束值。

我的第二个 for 循环从范围值的 1 开始,然后第二次循环它再次返回 1。我认为它会停止,因为当它第二次增加 2 时 1 + 2 = 3 这将是正在测试的 3 char 字符串“III”之外的索引。到底是怎么回事?

class Solution:
    def romanToInt(self, s: str) -> int:
        # dictionary of values 
        sdict = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
        scases = {"IV":4,"IX":9,"XL":50,"XC":90,"CD":400,"CM":900}
        
        if s in scases:
            return scases[s]
        else:
            fnum = 0
            for cind in range(0,len(s),2):
                print("loop1 " + str(cind))
                fullchar = None
                char1 = s[cind]
                for cind2 in range(1,len(s),2):
                    print("loop2 " + str(cind2))
                    char2 = s[cind2]
                    fullchar = char1 + char2
                    if fullchar in scases:
                        fnum += scases[fullchar]
                    else:
                        fnum += sdict[char1] + sdict[char2]
                if fullchar == None:
                    fnum += sdict[char1]
            return fnum

非常感谢。

标签: python-3.x

解决方案


您的内for循环被执行两次,因为它在您的外for循环内。

为了简化,考虑一下:

while True:
    for i in range(1, 3, 2):
        print(i)

您是否希望for循环只执行一次?每次您重新进入循环range(1, 3, 2)时,都会重新评估并且循环再次发生。

您的示例简化是这样的:

for i in range(0, 3, 2):
    print(i)
    for j in range(1, 3, 2):
        print(j)

如果内部for循环只执行一次,而外部循环执行了两次,那将是令人惊讶的(对我来说)。

看来您正在寻找的东西类似于包装中zip_longest的东西。itertools

from itertools import zip_longest
for i, j in zip_longest(range(0, 3, 2), range(1, 3, 2)):
    print(i, j)

话虽如此,您的方法会因输入而中断,'XIV'但我将把它留作练习。


推荐阅读