将defaultdict中的列表项追加为嵌套字段

时间:2015-11-22 16:52:52

标签: python python-3.x

我在学习如何实现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"}]}
]}

你能帮忙吗?

1 个答案:

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