整数到罗马数字的转换(python)

Conversion of integers to Roman numerals (python)

我知道有很多关于此主题的类似问题。但是我还有一些疑惑需要弄清楚。

def int_to_roman(input):

    if type(input) != type(1):
        raise TypeError, "expected integer, got %s" % type(input)
    if not 0 < input < 4000:
        raise ValueError, "Argument must be between 1 and 3999"   
    ints = (1000, 900,  500, 400, 100,  90, 50,  40, 10,  9,   5,  4,   1)
    nums = ('M',  'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
    result = ""
    for i in range(len(ints)):
        count = int(input / ints[i])
        result += nums[i] * count
        input -= ints[i] * count
    return result

我不太理解下面的代码:

for i in range(len(ints)):
    count = int(input / ints[i])
    result += nums[i] * count
    input -= ints[i] * count

是否:

for i in range (len(ints)):

表示'1000','900','800'(分别为整数)还是表示13(整数中的13个整数)?

count = int(input / ints[i])

整数 [i] 是什么意思?

谁能解释一下这些代码?如果你能展示例子(比如替换数字并展示它是如何工作的)就更好了

两个列表的名称很糟糕(intsnums)。

但是,从最高的罗马数字 (nums[0] = 'M') 开始,循环找出该数字 (ints[0] = 1000) 的值分为多少次输入值,并将数字多次附加到结果字符串。

然后它从输入中减去刚刚添加到结果 (ints[0] * count) 的字符串的值,然后移动到下一个罗马数字 (nums[1]) 以重复该过程余数

两个列表,intsnums长度相同。循环遍历 ints 的长度,这意味着变量 i 可以访问任一列表的相同位置,将一个与另一个匹配。

如果我们单步执行循环,count 被赋予输入的整数值除以 ints 中的第一个数字,即 1000。如果 input 变量是,比方说 10,那么 10/1000 将导致数字 <1,并且在结果上使用 int() 将导致它将 0 分配给 count。当0乘以nums中的匹配字符串时,赋值的结果基本为空。然后从 input 中减去相同的数量,在这种情况下保持不变。

最终,当除法的结果是一个>=1的数字时,循环将到达一个点,所以下面的步骤会做一些事情。

假设 int(input / ints[i]) 的结果是 3。"X" * 3 的结果是 "XXX",它被添加到 resultinput 被减少适当的数量,在本例中为 30。以此类推,直到循环结束。

def romanize(number):
   n2rMap = {1000:'M', 900:'CM', 500:'D', 400:'CD', 100:'C', 90:'XC', 50:'L', 40:'XL', 10:'X', 9:'IX', 5:'V', 4:'IV', 1:'I'}
   roman = ""
   for key in n2rMap.keys():
      count = int(number / key)
      roman += n2rMap[key] * count
      number -= key * count
   return roman