如何修正代码以统计嵌套JSON列表中按created[年月]分组的对象数量
问题
我有一个嵌套JSON对象列表,想要生成一个以created[year-month]为键、统计数量为值的字典。我写了以下代码:
result = {} for record in data_in: if record['created'][:7] not in result: result[record['created'][:7]] = {"created": 0} result[record["created"][:7]]["created"] += 1 result
这段代码的输出是:
{'2020-03': {'created': 1}, '2020-04': {'created': 1}, '2020-01': {'created': 3}}
但我期望的输出是:
{ '2020-03': 1, '2020-04': 1, '2020-01': 3 }
要求重构代码或提供更优实现,不得使用额外导入模块。附JSON数据示例:
data_in = [ { "package": "FLEXIBLE", "created": "2020-03-10T00:00:00", "summary": [ { "period": "2019-12", "documents": { "incomes": 63, "expenses": 13 } }, { "period": "2020-02", "documents": { "incomes": 45, "expenses": 81 } } ] }, { "package": "ENTERPRISE", "created": "2020-04-19T00:00:00", "summary": [ { "period": "2020-01", "documents": { "incomes": 15, "expenses": 52 } }, { "period": "2020-02", "documents": { "incomes": 76, "expenses": 47 } } ] }, { 'package': 'FLEXIBLE', 'created': '2020-01-15T00:00:00', 'summary': [ { 'period': '2020-03', 'documents': { 'incomes': 39, 'expenses': 48 } }, { 'period': '2020-04', 'documents': { 'incomes': 76, 'expenses': 20 } } ] }, { 'package': 'INTERNAL', 'created': '2020-01-07T00:00:00', 'summary': [ { 'period': '2019-12', 'documents': { 'incomes': 4, 'expenses': 53 } }, { 'period': '2020-01', 'documents': { 'incomes': 60, 'expenses': 48 } }, { 'period': '2020-02', 'documents': { 'incomes': 88, 'expenses': 85 } }, { 'period': '2020-03', 'documents': { 'incomes': 84, 'expenses': 81 } } ] }, { 'package': 'ENTERPRISE', 'created': '2020-01-03T00:00:00', 'summary': [ { 'period': '2020-04', 'documents': { 'incomes': 27, 'expenses': 13 } } ] }]
解决方案
重构原有代码
原代码的问题是将每个月份对应的值设置为嵌套字典,只需直接用数字作为值即可:
result = {} for record in data_in: month_key = record['created'][:7] if month_key not in result: result[month_key] = 0 result[month_key] += 1
这段代码逻辑和原代码一致,去掉了不必要的嵌套字典,直接输出期望格式。
更简洁的实现
利用字典的get()方法简化判断逻辑,省去if分支:
result = {} for record in data_in: month_key = record['created'][:7] result[month_key] = result.get(month_key, 0) + 1
get(month_key, 0)会返回对应键的值,若键不存在则返回0,一行完成计数操作,代码更简洁。
内容的提问来源于stack exchange,提问作者Mar3eczek17
相关产品推荐
相关产品推荐

