python-3.x - 如果带有 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
非常感谢。
解决方案
您的内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'
但我将把它留作练习。
推荐阅读
- .net - InitializeComponent() 不存在 - 多目标项目 (4.6.1 & 5)
- teradata - 通过 .NET 连接器查询的错误结果,但直接在 Teradata Studio 中更正了结果
- sql - 每个点返回的行数 PostGIS
- javascript - Nodemailer连接错误仅在服务器上
- r - ggplot2如何仅对数据的某些行着色
- java - 将jOOQ表达式分配给局部变量时如何防止Eclipse添加@NotNull注释
- python - 在 python 套接字服务器上从客户端接收文件
- tarantool - 如何在 tarantool 中将乙烯基转换为 memtx?
- string - 这个模板字符串/公式字段的格式是什么?
- vba - MS Access – 过滤#Multiple Criteria 同时忽略空值