python - 基于正则表达式连接嵌套字典值
问题描述
我有一个嵌套字典,其中包含日期及其相应的对象类型(不是编程中认为的对象),如下所示:
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 中实现它时遇到了麻烦,如果有人可以帮助我,我将不胜感激。谢谢
解决方案
您可以先将数字值与文本中的月份分开,然后重新组合:
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']}}
推荐阅读
- php - Laravel 7 sanctum 数据库连接问题
- azure-active-directory - 如何使用单个电子邮件帐户在 Azure AD B2C 中创建多个帐户?
- swift - 与 Ubuntu 18.04 上的 libssl-dev 不兼容,我的构建路径需要 libssl1.0-dev
- json - JSON & REACT 16.8 TypeError: _data_projects_json__WEBPACK_IMPORTED_MODULE_2__.map 不是函数
- maven - 如何将 ControlsFX 中的 AutoCompletionBinding 集成到使用 Maven 构建的模块化 JavaFX 14 项目中?
- java - 如何从 https://stackoverflow.com/questions/1864076/equivalent-function-to-cs-getch-in-java 在这个 getch 类中获取字符并处理它
- javascript - 如何使用教授提供的代码让我的 React 应用程序显示在 localhost:3000 上?
- mysql - 如何计算每行的MYSql中的AVG()
- c# - C# winapi 鼠标事件
- python - 将 txt 文件读入多个数据帧,这些数据帧由数据之间的空白间隔分割