python - 整数转罗马while循环详解-Python

标签 python loops data-conversion roman-numerals

我试图理解程序中的 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 将导致 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 而不是 LVIII。)当在该行使用断点时,看起来顺序在有和没有 排序时保持不变

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

最佳答案

如果没有 sorted,循环将从 1, 'I' 开始。然后它会被尽可能多地使用。在这种情况下,这将导致 58 个 I。 (然后它将继续到 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'。然后继续循环获取剩余的数字。

关于python - 整数转罗马while循环详解-Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55427678/

相关文章:

python - 从python中的列表中选择某些元素

python - matplotlib geopandas 绘制 choropleth,并设置颜色方案的 bin

python - 如何在 Qualtrics 中循环数百个图像 - 实现代码所需的帮助

r - 转换 R 中输入为 'X Weeks, Y Days, Z hours' 的年龄

Python - Matplotlib 使用 pandas 数据框时绘制不正确的图形

python : fit a curve to a list of integers

java - 如何用一个循环遍历二维数组?

c++ - 需要在 while 循环中打断

java - 如何在Java中将11位十六进制数转换为唯一的11位十进制数?

wpf - WPF 中的 MVVM 和转换错误 - 将 View 中的 ConvertBack 异常与模型中的验证错误相结合?