【发布时间】: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