Как найти и заменить символы во вложенном списке, используя python? - PullRequest
1 голос
/ 01 августа 2020

У меня есть вложенный список со значениями времени. Я хочу проверить и заменить время, которое не соответствует формату времени «ЧЧ: ММ». Первый шаг, который я хочу сделать, - это добавить «: 00» для чисел, у которых нет «:». Мой список выглядит как список ниже (mylist).

mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM], ['y',  7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]

res = [['x', '6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM], ['y',  7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM]]

Я пробовал этот код:

for idx, (id,name) in enumerate(mylist):

    for n2,j in  enumerate(name.split(' - ')) :
        if ':' not in j and id not in j:
            print(name)
            if ":" not in name.split('-')[0] and ":" not in name.split('-')[1]:
                list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
                                name.split('-')[1].split(' ')[1].strip() + ':00' + ' PM'
                # print(name)
            elif ":" not in name.split('-')[0]:
                list1[idx][n2] = name.split('-')[0].split(' ')[0] + ':00' + ' AM' + ' - ' + \
                                name.split('-')[1].split(' ')[1].strip() + ' PM'

            elif ":" not in name.split('-')[1]:
                list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
                    1].strip() + ':00' + ' PM'
            else:
                list1[idx][n2] = name.split('-')[0].split(' ')[0] + ' AM' + ' - ' + name.split('-')[1].split(' ')[
                    1].strip() + ' PM'

, но возникла следующая ошибка:

name.split ('-') [1] .split ('') [1] .strip () + 'PM' IndexError: индекс назначения списка вне диапазона

Как я могу решить проблему?

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Весь лог c вы используете правильно, но вам нужно заменить разбиение некоторым регулярным выражением. Например, если вы хотите быть уверены, что все значения времени в x совпадают с :00, вы можете применить что-то вроде этого:

test_text = "6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM"
print(re.sub(r'(\s|^)(\d+)(\s)', r'\1\2:00\3', test_text))
6:00 - 9:30 AM - 10:30 AM - 2:00 PM - 5:00 PM - 9:00 PM

Задача заключалась в том, чтобы вставить :00, поэтому:

  • Сначала мы проверяем, что это часы (либо начало строки, либо первое число после пустого места): (\s|^)
  • Затем мы проверяем, что это должно быть числом (или несколькими числами): (\d+)
  • Затем мы проверяем, что в нем нет минут (после пустого места): (\ s)
  • Затем мы упоминаем все группы (\1, \2, \3), чтобы re.sub не касался их, а просто вставьте :00 между ними.

Вы можете применить тот же logi c на все возможные задачи, которые у вас есть здесь.

1 голос
/ 01 августа 2020

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

Ваш список ввода, в который я добавил недостающие одинарные кавычки:

mylist = [['x', '6 - 9:30 AM - 10:30 AM - 2 PM - 5 PM - 9 PM'], ['y', '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM']]

Определите функцию f () , которая будет анализировать в HH: MM каждое из входных значений (при условии, что все они разделены запятой или da sh):

def f(time):
    t = re.findall(r'\d+', time)
    suffix = ""
    if "AM" in time:
        suffix = "AM"
    elif "PM" in time:
        suffix = "PM"
    if len(t) > 1:
        return ':'.join(t) + suffix
    return t[0] + ":00" + suffix

В основном он извлекает цифры с использованием регулярного выражения для входных значений, синтаксический анализ их в часы и минуты и, наконец, примените правильный суффикс (либо пустой / AM / PM в соответствии с требованиями).

Например, это напечатает ваши значения:

for ls in mylist:
    ls = re.split('-|,', ls[1])
    print([f(x) for x in ls])
...