gpt4 book ai didi

python - 如何根据字典属性唯一合并字典列表

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:25 24 4
gpt4 key购买 nike

我有两个 Django 查询集,我想根据其日期属性合并它们。嗯,这不是真正的 Django 问题,但我尝试尽可能清楚地解释。
我需要根据两个数据属性对条目进行分组。假设我有一个模型:

class User(models.Model):
start_date = models.DateField(blank=True, null=True)
end_date = models.DateField(blank=True, null=True)
...

现在我需要按月对这些条目进行分组(有多少用户从 2010 年 5 月开始使用等):

truncate_start_date = connection.ops.date_trunc_sql('month', 'start_date')
report_start = User.objects.exclude(start_date__isnull=True)\
.extra({'month': truncate_start_date}).values('month')\
.annotate(start_count=Count('pk')).order_by('-month')

我对end_date有相同的查询:

truncate_end_date = connection.ops.date_trunc_sql('month', 'end_date')
report_end = Employee.objects.exclude(end_date__isnull=True)\
.extra({'month': truncate_end_date}).values('month')\
.annotate(end_count=Count('pk')).order_by('-month')

现在这是 report_start 的样子:

[{'start_count': 33, 'month': datetime.datetime(2016, 5, 1, 0, 0, tzinfo=<UTC>)}, 
{'start_count': 79, 'month': datetime.datetime(2016, 4, 1, 0, 0, tzinfo=<UTC>)},
{'start_count': 72, 'month': datetime.datetime(2016, 3, 1, 0, 0, tzinfo=<UTC>)},
... ]

现在,如何将这两个字典列表合并为一个基于月份的列表?我尝试了chain,但存在重复的month记录。
我想要得到:

[{'start_count': 33, 'end_count': None, 'month': datetime.datetime(2016, 5, 1, 0, 0, tzinfo=<UTC>)}, 
{'start_count': 79, 'end_count': 2, 'month': datetime.datetime(2016, 4, 1, 0, 0, tzinfo=<UTC>)},
{'start_count': 72, 'end_count': 8, 'month': datetime.datetime(2016, 3, 1, 0, 0, tzinfo=<UTC>)},
... ]

我能想到的是将其更改为 dict,然后返回到 dict 列表。但我相信这不是一个非常优雅的解决方案,必须有更好的方法来编写这种 pythonic 方式。
有任何想法吗?这是我的丑陋代码:

d = dict()
for end in report_end:
d[end['month']] = {"end_count": end['end_count']}
for start in report_start:
if start['month'] in d.keys():
d[start['month']]["start_count"] = start['start_count']
else:
d[start['month']] = {"start_count": start['start_count']}
result = []
for key, i in d.items():
result.append({'month': key,
'start_count': i['start_count'] if 'start_count' in i.keys() else None,
'end_count': i['end_count'] if 'end_count' in i.keys() else None})

最佳答案

datetime 是可哈希的,因此您可以将其存储为 dict 的键并轻松合并。这是使用 itemgetter 的更简洁的解决方案。这假设您的时间戳在每个 dict 列表中都是唯一的。

from operator import itemgetter
import datetime


starts = [
{'start_count': 33, 'month': datetime.datetime(2016, 5, 1, 0, 0)},
{'start_count': 79, 'month': datetime.datetime(2016, 4, 1, 0, 0)},
{'start_count': 72, 'month': datetime.datetime(2016, 3, 1, 0, 0)}
]

# dummy data
ends = [
{'end_count': 122, 'month': datetime.datetime(2016, 5, 1, 0, 0)},
{'end_count': 213, 'month': datetime.datetime(2016, 4, 1, 0, 0)},
{'end_count': 121, 'month': datetime.datetime(2016, 3, 1, 0, 0)}
]


starts = dict(map(itemgetter('month', 'start_count'), starts))
ends = dict(map(itemgetter('month', 'end_count'), ends))


joined = [{'month': m, 'start_count': s, 'end_count': ends.get(m, None)}
for m, s in starts.items()]

关于python - 如何根据字典属性唯一合并字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com