i wrote this code:
admitted_List = [1, 5, 10, 50, 100, 500, 1000]
tempString = ""
finalList = []
for i in range(len(xkcd)-1):
if int(xkcd[i] xkcd[i 1]) in admitted_List:
tempString = xkcd[i]
continue
else:
tempString = xkcd[i]
finalList.append(int(tempString))
tempString = ""
return (finalList)
that basically takes in (xkcd) a string of weights of roman numbers like '10010010010100511' and it should return me the list of weights like [100, 100, 100, 10, 100, 5, 1, 1] so that C C C XC V I I makes sense, of course the first 4 chars of the string make the number 1001 that in roman numbers means nothing so my number will be 100 and then the check should stop and begin a new number.
I tried the above algorithm. Please excuse me if bad code or bad body question, I'm pretty new to python and stack overflow.
CodePudding user response:
Try this code:
def func(xkcd):
admitted_List = ["1000", "500", "100", "50", "10", "5", "1"]
tempString = ""
finalList = []
loop_out = 0
while loop_out == 0:
for roman_num in admitted_List:
#print(roman_num)
if (xkcd.startswith(roman_num)):
finalList.append(int(roman_num))
xkcd = xkcd[len(roman_num):]
if len(xkcd) == 0:
loop_out = 1
break
return (finalList)
xkcd = '10010010010100511'
print(func(xkcd))
It prints the following list: [100, 100, 100, 10, 100, 5, 1, 1]
CodePudding user response:
No need to go extra complex with functions! How about using re.split()
combined with list comprehension?
text = '10010010010100505011'
[i j for i,j in zip(re.split('(1|5)',text)[1::2],re.split('(1|5)',text)[::2][1:])]
Returns:
['100', '100', '100', '10', '100', '50', '50', '1', '1']
We can then either map them to roman, or transform to int
by using int(i j)
in the solution proposed above.