我在学习如何实现defaultdict,我想将cid,cname字段附加到'User'中名为'cfields'的嵌套对象
尝试下面的代码,我在添加cid,cname字段
时遇到了一些困难from collections import defaultdict
s = {"User":[
{"pid":1,"loc":"sf","cid":1,"cname":"Tesla"},
{"pid":1,"loc":"sf","cid":2,"cname":"Honda"},
{"pid":1,"loc":"sf","cid":3,"cname":"Jaguar"},
{"pid":2,"loc":"ch","cid":7,"cname":"Maruti"},
{"pid":2,"loc":"ch","cid":2,"cname":"Honda"},
{"pid":2,"loc":"ch","cid":9,"cname":"Jetx"}
]};
slist=s['User']
d = defaultdict(list)
for cname in slist:
key = 'cfields'
cname=slist[3] # what to write to append cid and cname to cfields ?
d[key].append(cname)
print(d)
我想得到如下结果
{"User":[
{"pid":1,"loc":"sf","cfields":[{"cid":1,"cname":"Tesla"},{"cid":2,"cname":"Honda"},{"cid":3,"cname":"Jaguar"}]},
{"pid":2,"loc":"ch","cfields":[{"cid":7,"cname":"Maruti"},{"cid":2,"cname":"Honda"},{"cid":9,"cname":"Jetx"}]}
]}
你能帮忙吗?
答案 0 :(得分:2)
不确定为什么要在此处使用默认值。您应该使用itertools.groupby
:
>>> data = []
>>> for g, items in itertools.groupby(s['User'], lambda x: (x['pid'], x['loc'])):
items = [{k: v for k, v in item.items() if k not in ('pid', 'loc')} for item in items]
data.append({ 'pid': g[0], 'loc': g[1], 'cfields': items })
>>> data
[{'pid': 1, 'cfields': [{'cid': 1, 'cname': 'Tesla'}, {'cid': 2, 'cname': 'Honda'}, {'cid': 3, 'cname': 'Jaguar'}], 'loc': 'sf'}, {'pid': 2, 'cfields': [{'cid': 7, 'cname': 'Maruti'}, {'cid': 2, 'cname': 'Honda'}, {'cid': 9, 'cname': 'Jetx'}], 'loc': 'ch'}]
>>> pprint.pprint(data)
[{'cfields': [{'cid': 1, 'cname': 'Tesla'},
{'cid': 2, 'cname': 'Honda'},
{'cid': 3, 'cname': 'Jaguar'}],
'loc': 'sf',
'pid': 1},
{'cfields': [{'cid': 7, 'cname': 'Maruti'},
{'cid': 2, 'cname': 'Honda'},
{'cid': 9, 'cname': 'Jetx'}],
'loc': 'ch',
'pid': 2}]