首页 > 解决方案 > 在列表中分组相似的月份和年份

问题描述

我有一个包含日期和金额的字典列表

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

我该怎么做呢?

标签: python-3.x

解决方案


您可以使用 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]}]

尽管将结果保存为字典更有意义,因为稍后访问键更容易,并且键已经是唯一的。


推荐阅读