首页 > 解决方案 > 基于正则表达式连接嵌套字典值

问题描述

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

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],如下所示:

04MAY14

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

04MAY

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

04MAY14

最终的 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 中实现它时遇到了麻烦,如果有人可以帮助我,我将不胜感激。谢谢

标签: pythonpython-3.xdictionary

解决方案


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

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

推荐阅读