вариант из восьмого поста выглядит несколько сомнительно - если есть повторяющиеся символы, каким образом find определит, какой именно символ ищется? Вот вариант записанный немного короче и без find:
from operator import add
def roman2arabic(roman):
d = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
if roman:
return reduce(add, ((-d[x], d[x])[y is None or d[x] >= d[y]] for x, y in map(None, roman, roman[1:])))
вариант работает только во втором питоне, в третьем более многословно:
from operator import add
from functools import reduce
from itertools import zip_longest
def roman2arabic(roman):
d = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
if roman:
return reduce(add, ((-d[x], d[x])[y is None or d[x] >= d[y]] for x, y in zip_longest(roman, roman[1:])))