我试图理解程序中的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()
而不是{IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
而不是LVIII
。)当在该行上使用断点时,无论有没有sorted
,顺序都保持不变。
2)第一个罗马数字是L
。为什么?调试时我注意到它从1000开始倒计时。当它达到50时,我看到roman == 'L'
。代码测试num >= k
。1000(M)也大于58。为什么条件num >= k
会导致L
成为第一个数字?
Python3:
如果没有}将为0。)对于{},循环从} returns a new list )当它到达{}时,while循环测试
sorted
,则循环将以1, 'I'
开头。然后尽可能多地使用它。在本例中,这将导致58I
(它将继续到4, 'IV'
,5, 'V'
等,但是{1000, 'M'
,然后900, 'CM'
开始,以此类推(排序在调试器中不可见的原因是^{58 >= 50
(您的观察中顺序错误),这是真的。然后将num
设置为8,roman
设置为'L'
。然后继续循环以获取剩余的数字。在sorted(numerals.items(), reverse=True)
不仅表示排序,还表示反向排序。关键点是reverse=True
。因为我们必须首先与最大的罗马帝国相比较。从M
到{I
到{"The logic says num>=k. 1000,M is also greater than num 58."
我想你在这里有误会。对于while num>=k:
,它发现小于或等于num,不太大,因此L
将是第一个。在希望这对你有帮助。在
相关问题 更多 >
编程相关推荐