【问题标题】:Concatinating nested dictionary values based on regular expressions基于正则表达式连接嵌套字典值
【发布时间】:2021-07-19 19:52:13
【问题描述】:

我有一个嵌套字典,其中包含日期及其对应的对象类型(不是编程中认为的对象),如下所示:

dict1 = {0: {'date': ['01', 'MAY', '14', '11MAY', '14', '18', 'MAY', '14'],
             'objecttype': ['Table', 'Anything', 'Chair']},
         1: {'date': ['12', 'MAY', '14', '12MAY14', '15MAY', '14'],
             'objecttype': ['Cup', 'Chair', 'fan']},
         2: {'date': ['05', 'MAY', '14', '13MAY14', '16MAY', '14'],
             'objecttype': ['Home', 'Desk', 'Pencil']},
         3: {'date': ['14', 'MAY', '14', '14MAY', '14', '04MAY14'],
             'objecttype': ['Cup', 'Stationery', 'Book']},
         4: {'date': ['15', 'MAY', '14', '15MAY14', '01', 'MAY', '14'],
             'objecttype': ['Eraser', 'Pen', 'Notebook']}}

所有日期和对象都有唯一键,例如 0-4。

可以看出,大多数日期的格式都不正确,对我们来说,正确的格式是 [Day][Month][Year],如下所示:

2014 年 4 月 4 日

我解决这个问题的方法是使用正则表达式并循环两次日期。在第一次尝试中,我想查找所有日期值,其中我只找到这样的两个数字,例如 '04' 并将它们连接到列表中的下一个值,如果它只包含三个这样的字母 '可能'。完成此步骤后,dict 中的大多数日期值将如下所示 [Day][Month]

5 月 4 日

在下一个循环中,我想找到只有日期和月份的所有日期实例,并将它们连接到列表中的下一个值,该值应该是具有两位数的年份值,以便我们拥有这种格式的所有日期最终:

2014 年 4 月 4 日

最终的 dict 将如下所示:

dict1 = {0: {'date': ['01MAY14', '11MAY14', '18MAY14'],
             'objecttype': ['Table', 'Anything', 'Chair']},
         1: {'date': ['12MAY14', '12MAY14', '15MAY14'],
             'objecttype': ['Cup', 'Chair', 'fan']},
         2: {'date': ['05MAY14', '13MAY14', '16MAY14'],
             'objecttype': ['Home', 'Desk', 'Pencil']},
         3: {'date': ['14MAY14', '14MAY14', '04MAY14'],
             'objecttype': ['Cup', 'Stationery', 'Book']},
         4: {'date': ['15MAY14', '15MAY14', '01MAY14'],
             'objecttype': ['Eraser', 'Pen', 'Notebook']}}

我在 python 中实现它时遇到了麻烦,如果有人可以帮助我,我将不胜感激。谢谢

【问题讨论】:

  • 更新了我的答案。

标签: python python-3.x dictionary


【解决方案1】:

您可以使用日期时间代替正则表达式:

from datetime import datetime

datetime_object = datetime.strptime('01MAY14', '%d%b%y')
print(datetime_object.strftime('%d/%m/%Y'))
#01/05/2014

更长的答案:

def get_date(d):
    if len(d) == 7:
        return datetime.strptime(d, '%d%b%y')
    else:
        return datetime.strptime(d, '%d%b')

def get_year(l):
    years = list()
    for d in l:
        y = get_date(d).year
        if y and (y not in years) and (y != 1900):
            years += [get_date(d).year]
    return next(iter(years))

def get_date_with_year(d, y):
    if len(d) == 7:
        return datetime.strptime(d, '%d%b%y')
    else:
        return datetime.strptime(d+str(y), '%d%b%Y')

def get_fixed_dates(l):

    year = get_year(l)
    return [get_date_with_year(d, year) for d in l]

l = '9MAY', '12MAY', '15MAY14'
print(get_fixed_dates(l))
#[datetime.datetime(2014, 5, 9, 0, 0), datetime.datetime(2014, 5, 12, 0, 0), datetime.datetime(2014, 5, 15, 0, 0)]

适用于所有字典:

def helper(dic):
    dic['date'] = get_fixed_dates(dic['date'])
    return dic
    

new_dict = {k: helper(v) for k, v in dict.items()}

【讨论】:

  • 最终计划就是这样,但首先我必须将所有分解的日期转换为“01MAY14”格式。现在仪式一切都搞混了。
  • 谢谢,我如何使用它来解决我的问题,以便它将函数应用于字典中的每个日期值。为这个菜鸟问题道歉,我是字典新手。
  • @AliZia 更新了,顺便说一句。重新声明纯 python 函数是不好的做法,例如 dict 用你自己的 dict = something 使用 d = ... 或一些独特的东西
  • 我认为我们只找到像“12”这样的日期值的情况被遗漏了。因此我得到错误: ValueError: time data '12' does not match format '%d%b'
  • 或者我的数据有垃圾值。这就是为什么要使用正则表达式。但感谢您的时间和帮助。
【解决方案2】:

您可以先将文本中的数字值与月份分开,然后重新组合:

import re
def to_dates(d):
   r = [i for a in d for i in re.findall('\d+|[a-zA-Z]+', a)]
   return [''.join(r[i:i+3]) for i in range(0, len(r), 3)]

dict1 = {0: {'date': ['01', 'MAY', '14', '11MAY', '14', '18', 'MAY', '14'], 'objecttype': ['Table', 'Anything', 'Chair']}, 1: {'date': ['12', 'MAY', '14', '12MAY14', '15MAY', '14'], 'objecttype': ['Cup', 'Chair', 'fan']}, 2: {'date': ['05', 'MAY', '14', '13MAY14', '16MAY', '14'], 'objecttype': ['Home', 'Desk', 'Pencil']}, 3: {'date': ['14', 'MAY', '14', '14MAY', '14', '04MAY14'], 'objecttype': ['Cup', 'Stationery', 'Book']}, 4: {'date': ['15', 'MAY', '14', '15MAY14', '01', 'MAY', '14'], 'objecttype': ['Eraser', 'Pen', 'Notebook']}}
new_dict = {a:{**b, 'date':to_dates(b['date'])} for a, b in dict1.items()}

输出:

{0: {'date': ['01MAY14', '11MAY14', '18MAY14'], 'objecttype': ['Table', 'Anything', 'Chair']}, 
 1: {'date': ['12MAY14', '12MAY14', '15MAY14'], 'objecttype': ['Cup', 'Chair', 'fan']}, 
 2: {'date': ['05MAY14', '13MAY14', '16MAY14'], 'objecttype': ['Home', 'Desk', 'Pencil']}, 
 3: {'date': ['14MAY14', '14MAY14', '04MAY14'], 'objecttype': ['Cup', 'Stationery', 'Book']}, 
 4: {'date': ['15MAY14', '15MAY14', '01MAY14'], 'objecttype': ['Eraser', 'Pen', 'Notebook']}}

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 2011-07-18
    • 2017-08-30
    • 1970-01-01
    • 2020-05-12
    • 2011-05-14
    • 2020-05-03
    • 2022-10-13
    • 2018-07-18
    相关资源
    最近更新 更多