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

#python #list #loops #integer

#python #Список #циклы #целое число

Вопрос:

У меня есть большой список списков if (это лишь некоторые из верхних строк):

 ['001-008  I', 'I', 'Enfermedades infecciosas y parasitarias', 2018, 6.398]
['001-008  I', 'I', 'Enfermedades infecciosas y parasitarias', 2017, 6.819]
 

И хочу применить функцию, которая мне нужна для преобразования второго столбца в целые числа и добавления его за вторым столбцом, чтобы результат выглядел следующим образом (не обращайте внимания на последние два столбца):

 ['001-008 I', 'I', 1, 'Enfermedades infecciosas y parasitarias', 1984, 3232]
['001-008 I', 'I', 1, 'Enfermedades infecciosas y parasitarias', 1992, 16]
 

Функция, которую я написал ранее,:

 def roman_to_int(r):
    rom_vals = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} 
    result = 0 
    for i,c in enumerate(r):
        if (i 1) == len(r) or rom_vals[c] >= rom_vals[r[i 1]]: 
            result  = rom_vals[c]
        else:
            result -= rom_vals[c]
    return(result)
 

Я пробовал понимание и объединение списка, но, похоже, вы не можете объединить функцию. Я смог вернуть список только преобразованных значений (целых чисел), но не смог добавить его в первоначальный список.

Комментарии:

1. Похоже, вы на самом деле вставляете int против converting в своем примере. Что это?

2. Итак, вы говорите, что ваша функция работает нормально, вы просто не знаете, как ее использовать, чтобы вернуть список с добавленным целым числом? Если да, то почему бы не поделиться своей попыткой в этом бит?

3. Извините за путаницу. Функция отлично работает для преобразования и вернет соответствующий int римской цифры. Моя проблема заключается в возврате исходного списка с добавлением столбца int. Я пробовал: для строки в lst: map(roman_to_int(строка), список) Также: lst = [[строка [:2] roman_to_int(строка[1]) строка[3:] для строки в совпадениях]]

Ответ №1:

Используйте insert():

 lst = [['001-008  I', 'I', 'Enfermedades infecciosas y parasitarias', 2018, 6.398],
       ['001-008  I', 'I', 'Enfermedades infecciosas y parasitarias', 2017, 6.819],
       ...]

for row in lst:
    row.insert(2, roman_to_int(row[1])) # changed here
 

Комментарии:

1. Спасибо! Я пробовал, но это выдает ошибку ключевого слова…

2. Я преобразовал список списков в фрейм данных и пытаюсь сделать это с помощью apply, но это дает мне ту же ошибку. Функция определена выше, а затем я попробовал ваш цикл for. Возможно, это потому, что функция принимает только строку. Я также пробовал следующее: ` для строки в совпадениях: для элемента в строке [1: 2]: row.insert(2, roman_to_int(elem)) ` Это дает мне ту же ошибку ключа: KeyError: ‘-‘

3. Полная ошибка выглядит следующим образом: KeyError Traceback (последний последний вызов) <ipython-input-13-784bde49923f> в <module> 54 для строки в совпадениях: 55 для элемента в строке[1:2]: —> 56 строка.вставка(2, romano_a_entero(элемент)) 57 58 <ipython-input-13-784bde49923f> в romano_a_entero(r) 37 результат = 0 38 для i,c в enumerate(r): —> 39 если (i 1) == len(r) или diccionario[c] >= diccionario[r[i 1]]: 40 resultado = diccionario[c] 41 else: ошибка ключа: ‘-‘

4. Извините, в моем ответе была ошибка, взгляните на мой отредактированный anser — я изменил roman_to_int(lst[1]) на roman_to_int(row[1]) это, должен (?) Исправить это для вас.

5. Еще раз спасибо! Действительно ценю это. Ключевая ошибка была вызвана некоторыми ошибками, которые произошли ранее, из-за некоторых нечистых данных. Наконец-то я смог ее решить.