Преобразование римских цифр в целые числа и наоборот


def int_to_roman (integer):

    returnstring=''
    table=[['M',1000],['CM',900],['D',500],['CD',400],['C',100],['XC',90],['L',50],['XL',40],['X',10],['IX',9],['V',5],['IV',4],['I',1]]

    for pair in table:

        while integer-pair[1]>=0:

            integer-=pair[1]
            returnstring+=pair[0]

    return returnstring

def rom_to_int(string):

    table=[['M',1000],['CM',900],['D',500],['CD',400],['C',100],['XC',90],['L',50],['XL',40],['X',10],['IX',9],['V',5],['IV',4],['I',1]]
    returnint=0
    for pair in table:


        continueyes=True

        while continueyes:
            if len(string)>=len(pair[0]):

                if string[0:len(pair[0])]==pair[0]:
                    returnint+=pair[1]
                    string=string[len(pair[0]):]

                else: continueyes=False
            else: continueyes=False

    return returnint


Комментарии
2 ответа

def int_to_roman (integer):

returnstring=''
table=[['M',1000],['CM',900],['D',500],['CD',400],['C',100],['XC',90],['L',50],['XL',40],['X',10],['IX',9],['V',5],['IV',4],['I',1]]

Элемент в вашем списке должны быть кортежи не перечислены. Она также должна быть глобальной константы, так что вы можете повторно использовать обе функции.

    for pair in table:

Использовать для письма, значения в таблице: а потом индексирования кортежи.

        while integer-pair[1]>=0:

Я думаю, что код выглядит лучше с междурядьем вокруг бинарных операторов. И почему это вместо: в то время как целое число >= пар[1]:?

            integer-=pair[1]
returnstring+=pair[0]

Наверное, будет лучше создать и добавить в список, а затем соединяют элементы списка вместе в конце.

    return returnstring

def rom_to_int(string):

table=[['M',1000],['CM',900],['D',500],['CD',400],['C',100],['XC',90],['L',50],['XL',40],['X',10],['IX',9],['V',5],['IV',4],['I',1]]
returnint=0
for pair in table:

continueyes=True

Всякий раз, когда я использовать логический флаг такой, я думаю: она должна быть удалена. Я думаю, что флаги, как это могли бы только запутать логику, что вы делаете. я думаю, что перерыв будет яснее после установки флага.

        while continueyes:
if len(string)>=len(pair[0]):

if string[0:len(pair[0])]==pair[0]:

струны имеют функции: как startswith, что делает это. Вы должны использовать его здесь. Там тоже нужно проверить длину. Если взять срез последних на конец строки в Python, вы просто получите более короткую строку.

                    returnint+=pair[1]
string=string[len(pair[0]):]

else: continueyes=False
else: continueyes=False

return returnint

Мой вариант кода:

def int_to_roman (integer):
parts = []
for letter, value in TABLE:
while value <= integer:
integer -= value
parts.append(letter)
return ''.join(parts)

def rom_to_int(string):
result = 0
for letter, value in table:
while string.startswith(letter):
result += value
string = string[len(pairs[0]):]
return result

Одна последняя мысль. Ваш rom_to_int не обработать случай, где прошло недопустимая строка. Вы, возможно, захотите рассмотреть вопрос о его исключение или что-то в этом случае.

8
ответ дан 1 октября 2011 в 03:10 Источник Поделиться

Выглядит хорошо. У меня есть несколько мыслей, каждая из них очень мелкие и основан в отзыв.


  • Я думаю, что было бы лучше перебрать диски и нумс вместо пар и того, чтобы помнить, что есть что. При этом используется функция Python, которая называется 'распаковка кортежа':

    for (rom, num) in table:
    print rom
    print num

  • Конкатенация строк снова и снова, медленнее, чем добавление в список - но что это, вероятно, не имеет значения для этого приложения! Если вы хотите, вы могли бы собирать римские цифры в список, прежде чем присоединиться к ним в конце:

    l = []
    for i in range(10):
    l.append('s')
    s = "".join(l)
    print s

  • таблица - это информация, общая для обеих функций; не то, что он изменится, а если доказательств для новых римских цифр никогда не был найден, было бы неплохо просто добавить их в одном месте. таблица может быть переменная уровня модуля.

  • Я лично считаю continueyes быть неловкой имя переменной - можно использовать continue_, следуя конвенции добавлять знак нижнего подчеркивания, чтобы избежать питон сайта.

  • Вы могли бы использовать перерыв вместо того, чтобы устанавливать continueyet = истина и жду , пока , чтобы проверить состояние.

    while True:
    if done:
    break

5
ответ дан 1 октября 2011 в 12:10 Источник Поделиться