python-3.x - 在列表中分组相似的月份和年份
问题描述
我有一个包含日期和金额的字典列表
records = [
{'date':'01 Feb 2020', 'amount':1000}, {'date':'03 Mar 2020', 'amount':2000},
{'date':'22 Mar 2020', 'amount':3000},
{'date':'12 Jan 2019', 'amount':1000}, {'date': '02 Feb 2018', 'amount':2500},
{'date': '02 Mar 2020', 'amount':2500}, {'date': '11 Feb 2020', 'amount':1200}
]
我正在努力实现一些目标。我想对类似的月份和年份进行分组并得到这样的结果:
result = [{'Feb 2020':[1000, 1200]}, {'March 2020':[2000, 3000, 2500]}, {'Jan 2019':[1000]}]
我该怎么做呢?
解决方案
您可以使用 acollections.defaultdict
进行分组,"date"
在第一个空格处拆分 withmaxsplit=1
以将日期与月份和年份分开,然后使用月份和年份字符串作为分组键。
from collections import defaultdict
records = [
{"date": "01 Feb 2020", "amount": 1000},
{"date": "03 Mar 2020", "amount": 2000},
{"date": "22 Mar 2020", "amount": 3000},
{"date": "12 Jan 2019", "amount": 1000},
{"date": "02 Feb 2018", "amount": 2500},
{"date": "02 Mar 2020", "amount": 2500},
{"date": "11 Feb 2020", "amount": 1200},
]
d = defaultdict(list)
for record in records:
day, month_year = record["date"].split(maxsplit=1)
d[month_year].append(record["amount"])
print(d)
输出:
defaultdict(<class 'list'>, {'Feb 2020': [1000, 1200], 'Mar 2020': [2000, 3000, 2500], 'Jan 2019': [1000], 'Feb 2018': [2500]})
defaultdict
是 的子类dict
,因此您可以将结果视为普通字典。
如果您不想使用库,那么dict.setdefault
也可以在这里使用:
d = {}
for record in records:
day, month_year = record["date"].split(maxsplit=1)
d.setdefault(month_year, []).append(record["amount"])
print(d)
甚至是您自己初始化空列表以查找丢失键的解决方案:
d = {}
for record in records:
day, month_year = record["date"].split(maxsplit=1)
if month_year not in d:
d[month_year] = []
d[month_year].append(record["amount"])
print(d)
这将给出类似的结果:
{'Feb 2020': [1000, 1200], 'Mar 2020': [2000, 3000, 2500], 'Jan 2019': [1000], 'Feb 2018': [2500]}
前两种解决方案的好处是当缺少键时会为您初始化空列表。
最后,如果我们想要一个字典列表作为结果,你可以构造一个列表推导:
[{k: v} for k, v in d.items()]
这会给你:
[{'Feb 2020': [1000, 1200]}, {'Mar 2020': [2000, 3000, 2500]}, {'Jan 2019': [1000]}, {'Feb 2018': [2500]}]
尽管将结果保存为字典更有意义,因为稍后访问键更容易,并且键已经是唯一的。
推荐阅读
- go - Gomock SetArg() 恐慌
- php - 是否使用 sudo 安装 symfony 项目
- python - 谷歌计算引擎上的 CPU 密集型任务停止运行
- c++ - 可以将任何原始类型传递给需要指针的函数吗?
- reactjs - 如何修复 useEffect 缺少依赖项“Dispatch”
- php - 使用 PHP 绘制吸管
- flutter - 颤振:如何将“美国/多伦多”转换为“EST5EDT,M3.2.0,M11.1.0”
- javascript - 如何将material-ui时间选择器更改为24小时格式
- r - 如何在 R 中以小于 1 秒的单位填充日期向量?
- c# - 将大量记录插入天蓝色表存储时记录丢失