Ten if powoduje,
if s[i:i + 2] in roman_and_integers: # i + 1 < len(s) ten zapis jest niepotrzebny
że w pierwszej kolejności są sprawdzane sekwencje dwu literowe czyli np. IV, IX, XL itd.
in roman_and_integers
sprawdza czy taka sekwencja jest na liście jeżeli tak to pobierana jest wartość przypisana do danej sekwencji
'IV': 4, 'IX': 9, 'XL': 40,
może taki zapis Tobie pomoże [ on-line ]
Dla zapisu rzymskiego np. II (2) nie ma na liście 'II': 2
roman_and_integers = { 'I': 1, 'II': 2, 'V': 5, ... }
więc warunek
if s[i:i + 2] in roman_and_integers:
jest niespełniony i wykonuje się else, które czyta sekwencję znaków pojedynczo.
roman_and_integers[s[i]]