我试图理解程序中的 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/