Целочисленный к римскому в то время как цикл объяснение-Python - PullRequest
2 голосов
/ 30 марта 2019

Я пытаюсь понять цикл 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) Почему код не работает, если вместо sorted(numerals.items(), reverse=True) используется numerals.items()? (Например, 58 приведет к IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII вместо LVIII.) Когда используется точка останова на этой строке, похоже, что порядок остается одинаковым как с sorted.

, так и без него.

2) Первая римская цифра - L. Зачем? При отладке я заметил, что отсчет начинается с 1000. Когда он достигает 50, я вижу, что roman == 'L'. Код проверяет, если num >= k. 1000 (M) также больше 58. Почему условие num >= k приводит к тому, что L является первой цифрой?

Ответы [ 3 ]

2 голосов
/ 30 марта 2019

Без sorted цикл начинается с 1, 'I'.Затем он будет использоваться столько раз, сколько возможно.В этом случае это приведет к 58 I с.(Затем он переходит на 4, 'IV', 5, 'V' и т. Д., Но num будет равно 0.) При sorted цикл начинается с 1000, 'M', затем 900, 'CM' и т. Д.сортировка не была видна в отладчике, так как sorted возвращает новый список .) Когда он достигает 50, 'L', цикл while проверяет, если 58 >= 50 (вы получили заказнеправильно в ваших наблюдениях), что правда.Затем он устанавливает num в 8 и roman в 'L'.Затем он продолжает цикл, чтобы получить оставшиеся цифры.

0 голосов
/ 30 марта 2019
# 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)
0 голосов
/ 30 марта 2019
  1. sorted(numerals.items(), reverse=True) означает не только сортировку, но и сортировку в обратном порядке.Ключевой момент - reverse=True.Потому что сначала нужно сравнить с крупнейшим римлянином.От M до I, а не от I до M.
  2. "The logic says num>=k. 1000,M is also greater than num 58." Я думаю, у вас здесь недоразумение.для while num>=k: он будет меньше или равен num, не большим, поэтому L будет первым.

Надеюсь, что это поможет вам.

...