【问题标题】:Integer to Roman while loop explanation-Python整数转罗马while循环解释-Python
【发布时间】:2019-03-30 02:43:43
【问题描述】:

我试图理解程序中的while 循环和sorted 调用,以将数字转换为下面的罗马数字。

numerals = { 1 : "I", 4 : "IV", 5 : "V", 9 : "IX", 10 : "X", 40 : "XL",
             50 : "L", 90 : "XC", 100 : "C", 400 : "CD", 500 : "D", 900 : "CM", 1000 : "M" }

num = 58  # LVIII

roman = ''

for k, v in sorted(numerals.items(), reverse=True):
    while num >= k:
        roman += v
        num -= k

print(roman)

问题: 1) 如果使用numerals.items() 而不是sorted(numerals.items(), reverse=True),为什么代码不起作用? (例如,58 将导致IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 而不是LVIII。)在该行上使用断点时,无论有无sorted,顺序看起来都相同。

2) 第一个罗马数字是L。为什么?调试时我注意到它从 1000 开始倒计时。当它达到 50 时,我看到 roman == 'L'。代码测试num >= k。 1000(M)也大于58。为什么num >= k条件会导致L是第一位?

【问题讨论】:

  • the code does not work unless "sorted(numerals.items(), reverse=True)" is used 没有它怎么办?你把它放在哪里?此外,AFAICT,num=58 answer> LVIII 是无效的语法。 answer> LVIII 应该是评论吗(以 # 开头)?
  • LVIII 仅供参考,以防有人运行代码。不使用 sorted 它会打印 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII。要获得 LVIII,需要使用 for k,v in sorted(numerals.items(), reverse=True):
  • 你有没有坐下来一步步弄清楚代码的作用?如有必要,请使用铅笔和纸或免费prints。如果您要编写代码,则需要培养这样做的能力。其他人为你回答这个问题对你没有任何帮助。如果您已经了解代码的作用,那么您需要更具体地了解哪些特定行为让您感到困惑或惊讶。最有可能的是,该语言为何以这些特定方式运行的答案已经在某处获得。

标签: python loops data-conversion roman-numerals


【解决方案1】:

没有sorted,循环将以1, 'I' 开始。然后它会被尽可能多地使用。在这种情况下,这将导致 58 个Is。 (然后它将继续到4, 'IV'5, 'V' 等,但num 将为0。)对于sorted,循环以1000, 'M' 开始,然后是900, 'CM' 等。(原因在调试器中看不到排序是sorted returns a new list。)当它到达50, 'L'时,while循环测试58 >= 50(你的观察顺序错误),这是真的。然后它将 num 设置为 8 并将 roman 设置为 'L'。然后它继续循环以获取剩余的数字。

【讨论】:

    【解决方案2】:
    1. sorted(numerals.items(), reverse=True) 不仅表示已排序,还表示反向排序。关键是reverse=True。因为我们必须先与最大的罗马人进行比较。从MI,而不是从IM
    2. "The logic says num>=k. 1000,M is also greater than num 58."我想你这里有误会。对于while num>=k:,它发现小于或等于num,不大,所以L 将是第一个。

    希望对你有所帮助。

    【讨论】:

    • 太棒了。现在很清楚了。不排序并从最大到最小开始比较的问题是它将选择 IIII 值作为匹配项。谢谢。
    • dict.items() 不保证有任何订单。你的答案不正确。
    • @jpmc26,抱歉,已修复。
    【解决方案3】:

    Python3:

    # num=58# answer> LVIII
    
    num = 58
    numerals = { 1 : "I", 4 : "IV", 5 : "V", 9 : "IX", 10 : "X", 40 : "XL",
            50 : "L", 90 : "XC", 100 : "C", 400 : "CD", 500 : "D", 900 : "CM", 1000 : "M" }
    roman=''
    #reserve numerals
    for k, v in sorted(numerals.items(), reverse=True):
        while num>=k:
            roman=roman+v
            num = num - k
    print(roman)
    
    
    
    

    【讨论】:

    • 这如何回答这个问题?
    • 我更新了示例代码,它正在工作。我认为这与@recnac 相同
    • 这不是被问到的。我认为他们确实有工作代码。
    • 问题更新为for k, v in sorted(numerals.items(), reverse=True):。当然,现在,问题的代码是没有问题的。
    猜你喜欢
    • 2021-12-15
    • 2022-07-08
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2022-01-13
    • 2023-01-10
    • 2015-07-24
    相关资源
    最近更新 更多