def romanToInt(s):
symbol= ['I','V','X','L','C','D','M']
value= [1,5,10,50,100,500,1000]
dic= {k:v for k,v in zip(symbol, value)}
sums=0
string= [i for i in range(len(s))]
for i in string:
if s[i] in ['I','X','C']:
left_index= list(dic.keys()).index(s[i])
next_symbol= list(dic.keys())[left_index + 1]
next2_symbol= list(dic.keys())[left_index + 2]
if i < len(s) and (s[i]== next_symbol or s[i]== next2_symbol):
sums+= dic[s[i+1]] -dic[s[i]]
string.remove(i)
string.remove(i+1)
elif i < len(s) and (s[i]!= next_symbol or s[i]!= next2_symbol):
sums+= dic[s[i]]
elif i== len(s):
sums+= dic[s[i]]
else:
sums+= dic[s[i]]
return sums
У меня возникла проблема с кодом, когда я соединил римские цифры, такие как IV, IX, XL и т. д., например «MCMXCIV», на выходе получается 2216 вместо 1994. Нужна помощь.
Отвечает ли это на ваш вопрос? Преобразование римских цифр в целые числа в Python
Да, но я пытаюсь исправить свое решение.
Я заметил, что вы изменяете строку, которую перебираете. Не знаю, какой эффект это окажет в данном конкретном случае, но в целом это не очень хорошая идея.
def romanToInt(s):
symbol = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
value = [1, 5, 10, 50, 100, 500, 1000]
dic = {k: v for k, v in zip(symbol, value)}
sums = 0
i = 0
while i < len(s):
if i < len(s) - 1 and dic[s[i]] < dic[s[i + 1]]:
sums += dic[s[i + 1]] - dic[s[i]]
i += 2
else:
sums += dic[s[i]]
i += 1
return sums
Правильная версия с циклом while
Вы можете использовать «римский» модуль, если не хотите создавать собственное решение.
import roman
n = "MCMXCIV"
print(roman.fromRoman(n))
Гравюры: 1994 г.
Спасибо, но я хочу придерживаться своего решения
В вашем коде нет ничего плохого, кроме логической ошибки. Вы выполняете вычитание в цикле для нескольких букв I, X и C, но при этом не учитывается вычитание остальных букв. Поэтому вместо этого обрабатывайте вычитание для V, L, D и M в одном цикле.
symbol = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
value = [1, 5, 10, 50, 100, 500, 1000]
dic = {k: v for k, v in zip(symbol, value)}
sums = 0
i = 0
while i < len(s):
if s[i] in ['I', 'X', 'C']:
current_val = dic[s[i]]
# don't need lists since strings can be indexed
if i < len(s) - 1 and (s[i:i+2] in ['IV', 'IX', 'XL', 'XC', 'CD', 'CM']):# definitely skipped a few cases
sums += dic[s[i+1]] - current_val
i += 2
else:
sums += current_val
i += 1
else:
sums += dic[s[i]]
i += 1
return sums
Но да, другие ответы определенно лучше с точки зрения кода, поскольку легче обрабатывать римские цифры справа налево, поскольку вам нужно только отслеживать следующий ввод. (хотя в лучшем случае всегда используется существующее решение)
Правило использования римских цифр гласит: если большому значению предшествует меньшее, то маленькое значение вычитается из большего. Итак, в приведенной выше последовательности это 1000 (M) + (CM) (1000 - 100) + (XC) (100 -10) + (IV) (5 - 1) = 1000 + 900 + 90 + 4..