繁体   English   中英

使用 python 在嵌套列表中的字符之前添加字符串

[英]Add string before character in nested list using python

我有一个很长的嵌套时间列表。 我想在列表中的一位数字之前添加“0”(如结果列表)。 我已经尝试了下面的代码块,但它不起作用。 我知道使用正则表达式是解决该问题的最佳方法。 但是我没有任何re package的经验。 如何使用re package 或任何其他解决方案解决该问题?

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()

试试这个正则表达式:

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']]

没有正则表达式:

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)。

试试这个, (\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']]

我为一个字符串量身定制了一个解决方案,将其放入 function 并在每个字符串上激活:

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() 

也应该工作

正如评论中提出的那样,解决问题的正确方法是使用时间解析工具,而不是正则表达式:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM