Добавить строку перед символом во вложенном списке, используя python - PullRequest
0 голосов
/ 02 августа 2020

У меня длинный вложенный список времен. Я хочу добавить «0» перед числом one-di git времени в списке (например, в списке результатов). Я пробовал приведенный ниже блок кода, но он не работает. Я знаю, что использование регулярного выражения - лучшее решение проблемы. Но у меня нет опыта использования пакета re. Как решить проблему с помощью пакета re или другого решения?

mylist = [
    ['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']
]

result = [
    ['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'],
    ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']
]


for idx, (id,name) in enumerate(list3):
    if  len(name.split('-')[0].split(':')[0]) <2 and  len(name.split('-')[1].split(':')[0]) <3:
         list3[idx][1] = '0'+name.split('-')[0] + ' - ' + '0'+ name.split('-')[1].strip()
         # print 1
    if len(name.split('-')[0].split(':')[0]) < 2 and len(name.split('-')[1].split(':')[0]) == 3:
        list3[idx][1] = '0' + name.split('-')[0] + ' - ' +  name.split('-')[1].strip()
    if len(name.split('-')[0].split(':')[0]) == 2 and len(name.split('-')[1].split(':')[0]) < 3:
        list3[idx][1] =  name.split('-')[0] + ' - ' + '0'+name.split('-')[1].strip()

Ответы [ 5 ]

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

попробуйте это, (\d+?:) будет соответствовать 06:, 09:, 10: .., затем используйте rjust для префикса нулей

import re

mylist = [['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']]

print(
    [[re.sub("(\d+?:)", lambda m: m.group(1).rjust(3, '0'), y) for y in x]
     for x in mylist]
)

[['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'],
 ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]
1 голос
/ 02 августа 2020

Без регулярного выражения:

mylist = [['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']] 
result = []

for x in mylist:
  res = x[0]
  s = []
  for y in x[1].split(' '):
    if len(y) == 4:
      t = '0' + y 
      s.append(t)
    else:
      s.append(y)
  s = ' '.join(s)
  result.append([res,s])

print(result)

Обходит данный список (мой список), сохраняет первый элемент (x или y), затем разбивает список раз и выполняет итерацию по этому списку. если длина текущей строки равна 4, то ей нужно добавить ноль в начало, добавить ноль и добавить к новой строке, в противном случае добавить к новой строке s. добавляет строку к результатам. lmk, если у вас есть вопросы, я знаю, что объяснение могло бы быть немного лучше, но код должен быть довольно легко читаемым. Это ни в коем случае не самое эффективное решение и действительно работает только в том случае, если строка списка времени относительно неизменна по формату (поэтому все моменты времени, когда требуется ноль, всегда будут иметь длину 4, и никакой другой элемент в разделенной строке не будет иметь длину из 4).

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

Попробуйте это регулярное выражение:

import re

mylist = [['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']] 

result = [['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'], ['y',  '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]


for idx, (id,name) in enumerate(mylist):
    mylist[idx][1] = re.sub(r"(?<!\d)(\d:\d{2})", r"\1", mylist[idx][1])

# result:
[['x', '06:00 - 09:30 AM - 10:30 AM - 02:00 PM - 05:00 PM - 09:00 PM'], ['y', '07:30 AM - 02:30 PM, 07:30 AM - 02:30 PM, 07:30 AM - 01:30 PM']]
0 голосов
/ 02 августа 2020

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

from datetime import datetime as dt
from dateutil import parser

def fmt_time(t):
    return dt.strftime(parser.parse(t), "%I:%M %p")

result = [[item[0], 
           " - ".join(fmt_time(t) for t in item[1].split("-"))] 
          for item in mylist]
0 голосов
/ 02 августа 2020

Я адаптировал решение для одной строки, поместил его в функцию и активировал для каждой строки:

import re
str = '7:30 AM - 2:30 PM, 7:30 AM - 2:30 PM, 7:30 AM - 1:30 PM'
newStr = ""
isLead  = False
for char in str:
    if not isLead:
        if re.match("[0-9]", char ):
            isLead = True
            newStr += "0"
    if char == "M":
        isLead = False
    newStr += char

print(newStr)

Если вы действительно не хотите использовать регулярные выражения -

char.isnumeric() 

Также должно работать

...