python-3.xlistroman-numerals

How to convert an integer into a roman numeral?


I'm having trouble to make an integer into roman numeral for having an ouptut of integer with square brackets (I'm pretty sure it's a list, but what I want is to have an integer) and I couldn't find solution why I'm having 'None' on 'rom' value. I'm using python3.

roman.py

#!/usr/bin/env python3

import sys

def numToRom(number):
    rom = ["", "I", "III", "IV", "V", "VI", "VII", "VIII", "IX"]

    if number in range(0, 9):
       result = rom[number]
       return result

num = sys.argv[1:]
rom = numToRom(num)
print(num, " is ", rom)

$ ./roman.py 2

Old output:

['2'] is None

Desired output:

2 is II

Solution

  • Your problem stems from the fact that you're passing a list with a character inside to your function. And that function expects an integer (if number in range(0, 9)), so you need to convert it to the right integer.

    import sys
    
    def numToRom(number):
        if type(number) is list: # If you know your number might be a list with only one str(value)
            number = int(number[0])
        
        rom = ["", "I", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
    
        if number in range(0, 9):
           result = rom[number]
           return result
    

    That will work specifically for your use case, if number is of the form ['{some digit}]. If you want to get fancier, you could use recursion to return a list with the roman number of each number in a list, like so:

    def numToRom(number):
        if type(number) is list:
            rom = []
            for value in number:
                rom.append(numToRom(int(value)))
            return rom
        else:
            rom = ["", "I", "III", "IV", "V", "VI", "VII", "VIII", "IX"]
        
            if number in range(0, 9):
               result = rom[number]
               return result
    
    >>> num = ['2', '3', '5']
    >>> numToRom(num)
        ['2', '3', '5']  is  ['III', 'IV', 'VI']
    

    Note that this function works even if the values inside the input list are not characters, but normal integers.

    >>> num = [2, 3, 5]
    >>> rom = numToRom(num)
        [2, 3, 5]  is  ['III', 'IV', 'VI']