I’m trying to understand a function in Python meant to convert Roman numerals to integers. In the following code:
roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
s = "III"
i = 0
num = 0
while i < len(s):
if i 1<len(s) and s[i:i 2] in roman:
num =roman[s[i:i 2]]
i =2
else:
#print(i)
num
num =roman[s[i]]
i =1
print(num)
The if statement somehow gives an answer of 2, but when I think it through it looks like it should only loop through the if statement once and give 1. But when I think it through further and isolate this section I get a key error ‘II’ which makes sense. So how is the loop not throwing this error and giving a value of 2?
Appreciate any and all help!
CodePudding user response:
The first time through the loop, i = 0
and s[i:i 2] = 'II'
. 'II' in roman
is not true, so we go to the else:
block. s[i] = 'I'
, and roman['I'] = 1
, so we add 1 to num
, which now equals 1
. We also add 1
to i
.
The second time through the loop, i = 1
and s[i:i 2] = 'II'
. Again, that's not a key in the dictionary, so we go to the else:
block and add roman['I']
to num
. So now num = 2
. We also add 1
to i
.
The third time through the loop, i = 2
and i 1 < len(s)
is false. So we go to the else:
block. s[i] = 'I'
again, so we we add 1
to num
again. Now num = 3
. We also add 1
to i
.
Now i = 3
and the condition while i < len(s):
is no longer true, so the loop ends.
We never get a key error because we always check whether II
is a key in the dictionary before trying to access roman['II']
.