【每日一题0613】数据转换

#  将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 Like

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)

这个地方是用什么方法进行分组的呢

遍历,按相同的键,把值收集起来。

关闭