Home > Back-end >  Having trouble with a function that has to split a string into roman numbers weights
Having trouble with a function that has to split a string into roman numbers weights

Time:10-27

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.

  • Related