# 将test转变成result
test= [
{'fQY': 'A', 'fWD_MC': 'a1'},
{'fQY': 'A', 'fWD_MC': 'a2'},
{'fQY': 'A', 'fWD_MC': 'a3'},
{'fQY': 'B', 'fWD_MC': 'b1'},
{'fQY': 'C', 'fWD_MC': 'c1'},
{'fQY': 'C', 'fWD_MC': 'c2'}]
result= [
{'name': 'A', 'children': [{'name': 'a1'}, {'name': 'a2'}, {'name': 'a3'}]},
{'name': 'B', 'children': [{'name': 'b1'}]},
{'name': 'C', 'children': [{'name': 'c1'}, {'name': 'c2'}]}
]
解法1:借助生成器函数itertools.groupby
import itertools
def parse(inp):
out = list()
# groupby会按照指定的key进行归集,返回的结果是一个生成器。
# 其中第一个位置的值是分组依据的key对应的值,第二个位置的值则是按key分完组的结果,是一个子生成器。
for name, values in itertools.groupby(inp, key=lambda x: x['fQY']):
out.append({'name': name, 'children': [{'name': x['fWD_MC']} for x in list(values)]})
assert out == result
parse(test)
解法2:遍历
def parse2(inp):
# 提取:将两个字段的对应值进行提取,得到一个元组组成的列表
# >>> [('A', 'a1'), ('A', 'a2'), ('A', 'a3'), ('B', 'b1'), ('C', 'c1'), ('C', 'c2')]
pairs = [(item.get('fQY'), item.get('fWD_MC')) for item in test]
# 分组:按照第一个值进行归集,分别得到一对多的映射关系,存入字典。
# >>> {'A': [a1,a2,a3],'B': [b1], 'C':[c1,c2]}
dc = dict()
for item in pairs:
k, v = item
dc.setdefault(k, []).append({'name': v})
# 组装:按照result格式,逐个进行组装,得到最终结果
out = [dict(zip(('name', 'children'), (k, v))) for k, v in dc.items()]
assert out == result
parse2(test)
1 个赞
la=[(item.get(“fQY”),item.get(‘fWD_MC’)) for item in test]
print(la)
l2= {s[0] for s in la}
list3=
for m in l2:
dict1={}
# print(m)
list1=
for i in la:
# print(i)
if m==i[0]:
list1.append(i[1])
dict1[m]=list1
# print(dict1)
list3.append(dict1)
print(list3)
list4=
for i in list3:
# print(i)
for k,v in i.items():
dict4= {“name”:k,“children”:[{“name”:n}for n in v ]}
# print(dict4)
list4.append(dict4)
print(list4)
这个地方是用什么方法进行分组的呢
遍历,按相同的键,把值收集起来。