我有一本这样的字典:
result = { 'year' : {} }
,我有一个这样的查询集:
<QuerySet [{'building_id': 1, 'year': 2019, 'demand': 123.34}, {'building_id': 1, 'year': 2019, 'demand': 345.0}, {'building_id': 1, 'year': 2019, 'demand': 12345.0}, {'building_id': 2, 'year': 2019, 'demand': 345.0}]>
现在,我想将queryset的值转换为嵌套字典,使其看起来像这样:
result = { 'year' : {'1' : [123.34, 345.0, ...], '2' : [345, ...] }
我得到这样的查询集,因此它目前处于循环中:
for item in buildings:
demand_cool_item = item.demandcool_set.filter(year=passed_year).values('building_id', 'year', 'demand')
对于初学者,我试图遍历整个查询集,将其推入数组,然后像下面这样更新字典中的字典:
demand_cool_list = []
for item in buildings:
demand_cool_item = item.demandcool_set.filter(year=passed_year).values('building_id', 'year', 'demand')
demand_cool_list.append(demand_cool_item)
for item in demand_cool_list:
result.update(item)
也尝试过result.update(item['building_id']['demand'])
表示字典更新序列元素#0的长度为3; 2是必需的,或者我有类型错误。 ! 有人可以帮我这个忙吗?高度赞赏!预先感谢
答案 0 :(得分:1)
您可以遍历查询集,然后将值附加到适当的列表中,例如:
from collections import defaultdict
year_dict = defaultdict(list)
for demand in item.demandcool_set.filter(year=passed_year):
year_dict[demand.building_id].append(demand.demand)
result = {'year': dict(year_dict)}
或者我们可以在此处使用itertools.groupby
:
from itertools import groupby
from operator import itemgetter
result = { 'year': {
k: [v['demand'] for v in vs]
for k, vs in groupby(
item.demandcool_set.filter(
year=passed_year
).values('building_id', 'demand').order_by('building_id'),
itemgetter('building_id')
))
}}
因此,结果将包含一个键'year'
,该键映射到一个字典,该字典将building_id
s映射到demand
s。
请注意,如果您未按某个时间戳对查询集进行排序,则值可以按任何顺序出现,因此,不能保证列表中的顺序 。因此,您可能需要向查询集添加.order_by(..)
子句。